常用的 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实现ASP分页函数 HTML分页函数
Sep 22 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
Mar 05 Javascript
VUEJS实战之利用laypage插件实现分页(3)
Jun 13 Javascript
微信小程序 LOL 英雄介绍开发实例
Sep 30 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
Apr 07 Javascript
Node.js服务器开启Gzip压缩教程
Aug 11 Javascript
基于vue组件实现猜数字游戏
May 28 Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 Javascript
React 实现车牌键盘的示例代码
Dec 20 Javascript
vue中axios封装使用的完整教程
Mar 03 Vue.js
React如何创建组件
Jun 27 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 登录记住密码实现思路
2013/05/07 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
详解python之简单主机批量管理工具
2017/01/27 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python逆序打印各位数字的方法
2018/06/25 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
销售目标责任书
2014/07/23 职场文书
新课培训心得体会
2014/09/03 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
2015年党建工作总结
2015/03/30 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python
Vue2.0搭建脚手架
2022/03/13 Vue.js
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS