常用的 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压缩利器
Feb 20 Javascript
火狐下table中创建form导致两个table之间出现空白
Sep 02 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
May 27 Javascript
Vue.directive自定义指令的使用详解
Mar 10 Javascript
js实现分页功能
May 24 Javascript
jQuery开源组件BootstrapValidator使用详解
Jun 29 jQuery
Vue.js实现的购物车功能详解
Jan 27 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
element form 校验数组每一项实例代码
Oct 10 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
javascript+css实现俄罗斯方块小游戏
Jun 28 Javascript
js实现星星海特效的示例
Sep 28 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生成静态页面详解
2006/11/19 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
php微信开发之关注事件
2018/06/14 PHP
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
理解javascript回调函数
2014/12/28 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
深入理解Django的自定义过滤器
2017/10/17 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Python3标准库总结
2019/02/19 Python
python简单区块链模拟详解
2019/07/03 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
中学生差生评语
2014/01/30 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书