常用的 JS 排序算法 整理版


Posted in Javascript onApril 05, 2018

1.冒泡排序

var bubbleSort = function(arr) {

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

  return arr;
};

2.选择排序

var selectSort = function(arr) {

  var min;
  for (var i = 0; i < arr.length - 1; i++) {
    min = i;
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[min] > arr[j]) {
        min = j;
      }
    }
    if (i != min) {
      swap(arr, i, min);
    }
    console.log(i + 1, ": " + arr);
  }
  return arr;
};

function swap(arr, index1, index2) {
  var temp = arr[index1];
  arr[index1] = arr[index2];
  arr[index2] = temp;
};

3.插入排序

var insertSort = function(arr) {
  var len = arr.length,
    key;
  for (var i = 1; i < len; i++) {
    var j = i;
    key = arr[j];
    while (--j > -1) {
      if (arr[j] > key) {
        arr[j + 1] = arr[j];
      } else {
        break;
      }
    }
    arr[j + 1] = key;
  }
  return arr;
};

4.希尔排序

function shellSort(arr) {
  if (arr.length < 2) {
    return arr;
  };
  var n = arr.length;
  for (gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap /= 2)) {
    for (i = gap; i < n; ++i) {
      for (j = i - gap; j >= 0 && arr[j + gap] < arr[j]; j -= gap) {
        temp = arr[j];
        arr[j] = arr[j + gap];
        arr[j + gap] = temp;
      }
    }
  }
  return arr;
};

5.归并排序

function merge(left, right) {
  var result = [];
  while (left.length > 0 && right.length > 0) {
    if (left[0] < right[0]) {
      // shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  return result.concat(left).concat(right);
}

function mergeSort(arr) {
  if (arr.length == 1) {
    return arr;
  }
  var middle = Math.floor(arr.length / 2),
    left = arr.slice(0, middle),
    right = arr.slice(middle);
  return merge(mergeSort(left), mergeSort(right));
}

6.快速排序

var quickSort = function(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  var pivotIndex = Math.floor(arr.length / 2); 
  var pivot = arr.splice(pivotIndex, 1)[0];

  var left = [];
  var right = [];

  for (var i = 0; i < arr.length; i++) {
 
    if (arr[i] < pivot) {



      left.push(arr[i]);


    } else {



      right.push(arr[i]);


    } 
  }

  return quickSort(left).concat([pivot], quickSort(right));

};

算法效率比较

---------------------------------------------------------------
| 排序算法 | 平均情况         | 最好情况   | 最坏情况   | 稳定性 |
---------------------------------------------------------------
| 冒泡排序 |  O(n²)          |  O(n)     |  O(n²)    | 稳定   |
---------------------------------------------------------------
| 选择排序 |  O(n²)          |  O(n²)    |  O(n²)    | 不稳定 |
---------------------------------------------------------------
| 插入排序 |  O(n²)          |  O(n)     |  O(n²)    | 稳定   |
---------------------------------------------------------------
| 希尔排序 |  O(nlogn)~O(n²) |  O(n^1.5) |  O(n²)    | 不稳定 |
---------------------------------------------------------------
| 归并排序 |  O(nlogn)       |  O(nlogn) |  O(nlogn) | 稳定   |
---------------------------------------------------------------
| 快速排序 |  O(nlogn)       |  O(nlogn) |  O(n²)    | 不稳定 |
---------------------------------------------------------------

Javascript 相关文章推荐
关于jQuery object and DOM element
Apr 15 Javascript
jquery实现简洁文件上传表单样式
Nov 02 Javascript
JS组件系列之Bootstrap Icon图标选择组件
Jan 28 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
js实现文字截断功能
Sep 14 Javascript
详解Node.js 命令行程序开发教程
Jun 07 Javascript
ES6中新增的Object.assign()方法详解
Sep 22 Javascript
浅谈手写node可读流之流动模式
Jun 01 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
Feb 20 Javascript
vue计算属性computed的使用方法示例
Mar 13 Javascript
layer页面跳转,获取html子节点元素的值方法
Sep 27 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 Javascript
通过 JS 判断页面是否有滚动条的实现方法
Apr 05 #Javascript
mint-ui在vue中的使用示例
Apr 05 #Javascript
webpack热模块替换(HMR)/热更新的方法
Apr 05 #Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 #Javascript
express默认日志组件morgan的方法
Apr 05 #Javascript
React Native悬浮按钮组件的示例代码
Apr 05 #Javascript
关于Google发布的JavaScript代码规范你要知道哪些
Apr 04 #Javascript
You might like
php中用文本文件做数据库的实现方法
2008/03/27 PHP
深入解析php之sphinx
2013/05/15 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
介绍Python中的文档测试模块
2015/04/28 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python实现进程同步和通信的方法
2018/01/02 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
python logging通过json文件配置的步骤
2020/04/27 Python
Django多数据库联用实现方法解析
2020/11/12 Python
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
2014红色之旅心得体会
2014/10/07 职场文书
工作时间调整通知
2015/04/24 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python