常用的 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 相关文章推荐
jquery重复提交请求的原因浅析
May 23 Javascript
Node.js事件循环(Event Loop)和线程池详解
Jan 28 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
jQuery设置Easyui校验规则(推荐)
Nov 21 Javascript
JavaScript实现格式化字符串函数String.format
Dec 16 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
使用javaScript实现鼠标拖拽事件
Apr 03 Javascript
Vue2.0 实现单选互斥的方法
Apr 13 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
JS合并两个数组的3种方法详解
Oct 24 Javascript
JS实现碰撞检测效果
Mar 12 Javascript
ES5和ES6中类的区别总结
Dec 21 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
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
PHP 文件上传限制问题
2019/09/01 PHP
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
Python-嵌套列表list的全面解析
2016/06/08 Python
微信跳一跳游戏python脚本
2020/04/01 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
python 求10个数的平均数实例
2019/12/16 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
C语言50道问题
2014/10/23 面试题
千元咖啡店的创业计划书范文
2013/12/29 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
《尊严》教学反思
2014/02/11 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
小学四年级学生评语
2014/12/26 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS