常用的 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 在网页中的运用(asp.net)
Nov 23 Javascript
jQuery学习笔记之jQuery的事件
Dec 22 Javascript
浅谈JavaScript函数节流
Dec 09 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 Javascript
Angular1.x复杂指令实例详解
Mar 01 Javascript
jQuery.ajax向后台传递数组问题的解决方法
May 12 jQuery
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
Oct 24 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 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中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
微信小程序 rich-text的使用方法
2017/08/04 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
对python 调用类属性的方法详解
2019/07/02 Python
python语言中有算法吗
2020/06/16 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
信息部岗位职责
2013/11/12 职场文书
学校消防演习方案
2014/02/19 职场文书
小学生秋游活动方案
2014/02/23 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
2019求职信大礼包
2019/05/15 职场文书
纯html+css实现打字效果
2021/08/02 HTML / CSS