常用的 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 相关文章推荐
js 触发select onchange事件代码
Mar 20 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
JS脚本实现动态给标签控件添加事件的方法
Jun 02 Javascript
JS button按钮实现submit按钮提交效果
Nov 01 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
微信小程序图片自适应支持多图实例详解
Jun 21 Javascript
微信小程序删除处理详解
Aug 16 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
express 项目分层实践详解
Dec 10 Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
Sep 03 Javascript
JavaScript实现公告栏上下滚动效果
Mar 13 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
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
php变量作用域的深入解析
2013/06/03 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
javascript简易画板开发
2020/04/12 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
python中的reduce内建函数使用方法指南
2014/08/31 Python
使用python实现省市三级菜单效果
2016/01/20 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
python让列表倒序输出的实例
2018/06/25 Python
python之django母板页面的使用
2018/07/03 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
Python3.8中使用f-strings调试
2019/05/22 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
谢师宴邀请函
2015/02/02 职场文书
2016新年问候语大全
2015/11/11 职场文书
小学科学课教学反思
2016/02/23 职场文书