常用的 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 简单抽屉效果的实现代码
Mar 09 Javascript
php跨域调用json的例子
Nov 13 Javascript
JS烟花背景效果实现方法
Mar 03 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
JavaScript编写简单的计算器
Nov 25 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
深入浅析Bootstrap列表组组件
May 03 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
javascript中的隐式调用
Feb 10 Javascript
Koa2 之文件上传下载的示例代码
Mar 29 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
Sep 28 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 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循环使用详解与实例代码
2010/05/08 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
机电工程学生自荐信范文
2013/12/07 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
同居协议书范本
2014/04/23 职场文书
企业文明单位申报材料
2014/05/16 职场文书
社会工作专业自荐信
2014/09/26 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
基石观后感
2015/06/12 职场文书
交通安全温馨提示语
2015/07/14 职场文书
子女赡养老人协议书
2016/03/23 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏