常用的 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 相关文章推荐
JavaScript 捕获窗口关闭事件
Jul 26 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
May 24 Javascript
Javascript在IE和FireFox中的不同表现简析
Dec 03 Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
vue增删改查的简单操作
Jul 15 Javascript
详解微信小程序审核不通过的解决方法
Jan 17 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
Mar 01 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 Javascript
el-table树形表格表单验证(列表生成序号)
May 31 Javascript
javascript中layim之查找好友查找群组
Feb 06 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中的foreach问题
2013/06/30 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
js更优雅的兼容
2010/08/12 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
postman传递当前时间戳实例详解
2019/09/14 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python内存映射文件读写方式
2020/04/24 Python
Django分组聚合查询实例分享
2020/04/29 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
毕业自我评价范文
2013/11/17 职场文书
结对共建协议书
2014/08/20 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
优秀英文求职信范文
2015/03/19 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js