JavaScript中几种排序算法的简单实现


Posted in Javascript onJuly 29, 2015

排序算法的实现

我的JS水平就是渣渣,所以我就用类似于JAVA和C的方式来写JavaScript的排序算法了。

而且这里我不讲算法原理,仅仅只是代码实现,可能会有Bug,欢迎大家博客评论指导。
插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

实现代码如下:

function insertSort(arr) {
  if (!arr) return;
  var len = arr.length;
  if (len == 0 || len == 1) return;

  for (var i = 1, len = arr.length; i < len; i ++) {
    var stand = arr[i];
    for (var j = i - 1; j >= 0; j --) {
      if (arr[j] > stand) {
        arr[j + 1] = arr[j];
      } else {
        arr[j + 1] = stand;
        break;
      }
    }
  }

  return arr;
}

 

时间复杂度为:O(n^2)

当然,该算法是有优化余地的,例如将搜索替换的位置算法改为二分查找。
冒泡排序

经典的排序算法,提到冒泡排序我就心痛。本科时候的必须论文的冒泡排序算法的改进,结果写完论文之后都不能完整的实现冒泡排序算法,好尴尬。

if (!arr) return;
  var len = arr.length;
  if (len == 0 || len == 1) return;

  for (var i = 0; i < len; i ++) {
    for (var j = 0; j < len - i - 1; j ++) {
      if (arr[j] > arr[j + 1]) {
        var tmp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = tmp;
      }
    }
  }

  return arr;
}

时间复杂度为:O(n^2)
快速排序

非常经典的排序算法,排序过程主要i分为三步:

  1.     从数列中挑出一个元素,称为 “基准”(pivot);
  2.     重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3.     递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

实现代码如下:

function quickSort(arr, bt, ed) {
  if (bt < ed) {
    var pivot = findPartition(arr, bt, ed);
    quickSort(arr, bt, pivot - 1);
    quickSort(arr, pivot + 1, ed);
  }
}

function findPartition(arr, bt, ed) {
  var stand = arr[bt];

  while (bt < ed) {
    while (bt < ed && arr[ed] >= stand) {
      ed --;
    }
    if (bt < ed) {
      arr[bt ++] = arr[ed];
    }
    while (bt < ed && arr[bt] <= stand) {
      bt ++;
    }
    if (bt < ed) {
      arr[ed --] = arr[bt]; 
    }
  }

  arr[bt] = stand;
  return bt;
}

时间复杂度为:O(nlogn)。
归并排序

也是非常经典的排序算法,我就是借着学习js的机会复习经典的排序算法了。归并排序的思想可以参考我的这篇博客:归并排序。我这里只写js实现。

function mergeSort(arr, bt, ed) {
  if (bt < ed) {
    var mid = bt + parseInt((ed - bt) / 2);
    mergeSort(arr, bt, mid);
    mergeSort(arr, mid + 1, ed);
    mergeArray(arr, bt, mid, ed);    
  }
}

function mergeArray(arr, bt, mid, ed) {
  var mArr = [];
  var i = bt, j = mid + 1;
  while (i <= mid && j <= ed) {
    if (arr[i] <= arr[j]) {
      mArr.push(arr[i++]);
    } else {
      mArr.push(arr[j ++]);
    }
  }

  if (i <= mid) {
    mArr = mArr.concat(arr.slice(i, mid + 1));
  }

  if (j <= ed) {
    mArr = mArr.concat(arr.slice(j, ed + 1));
  }

  for (var h = 0; h < mArr.length; h ++) {
    arr[bt + h] = mArr[h];
  }
}

写归并排序的时候还有一个小插曲:就是js不能自动取整,后来用了parseInt方法,感觉萌萌大。

 

Javascript 相关文章推荐
解决 FireFox 下[使用event很麻烦] 的问题.
Aug 22 Javascript
JS DOM 操作实现代码
Aug 01 Javascript
浅谈javascript的分号的使用
May 12 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
Aug 03 Javascript
修改jquery中dialog的title属性方法(推荐)
Aug 26 Javascript
Bootstrap源码解读按钮(5)
Dec 23 Javascript
node.js中使用Export和Import的方法
Sep 18 Javascript
AngularJS实现表单验证功能详解
Oct 12 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
javascript中UMD规范的代码推演
Aug 29 Javascript
vue实现条件判断动态绑定样式的方法
Sep 29 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
详解JavaScript中数组的相关知识
Jul 29 #Javascript
javascript+canvas实现刮刮卡抽奖效果
Jul 29 #Javascript
js实现登陆遮罩效果的方法
Jul 28 #Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 #Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 #Javascript
简单的jQuery入门指引
Jul 28 #Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 #Javascript
You might like
PHP类的使用 实例代码讲解
2009/12/28 PHP
ThinkPHP采用模块和操作分析
2011/04/18 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
python中threading超线程用法实例分析
2015/05/16 Python
发布你的Python模块详解
2016/09/15 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
团支部建设方案
2014/05/02 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
机关作风建设心得体会
2014/10/22 职场文书
预备党员介绍人意见
2015/06/01 职场文书
初中政治教师教学反思
2016/02/23 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
CSS3实现指纹特效代码
2022/03/17 HTML / CSS