常用的 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 相关文章推荐
prototype Element学习笔记(Element篇三)
Oct 26 Javascript
jquery转盘抽奖功能实现
Nov 13 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
原生JavaScript编写canvas版的连连看游戏
May 29 Javascript
jQuery Ajax页面局部加载方法汇总
Jun 02 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
Apr 10 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
使用post方法实现json往返传输数据的方法
Mar 30 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
vue实现图片上传到后台
Jun 29 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 session会话的安全性分析
2011/09/08 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
Python中关键字is与==的区别简述
2014/07/31 Python
Python生成不重复随机值的方法
2015/05/11 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
新学期校长寄语
2014/01/18 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
领导干部廉政承诺书
2014/03/27 职场文书
员工福利申请报告
2015/05/15 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
Redis入门基础常用操作命令整理
2022/06/01 Redis