常用的 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 对象与DOM对象之两者相互间的转换
Apr 27 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
Nov 28 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
js使用eval解析json(js中使用json)
Jan 17 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
Sep 27 Javascript
原生js页面滚动延迟加载图片
Dec 20 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
Vue 打包后相对路径的引用问题
Jun 05 Vue.js
通过 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遍历数组的几种方法
2012/03/22 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
vue-cli配置flexible过程详解
2019/07/04 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
python添加模块搜索路径方法
2017/09/11 Python
Python探索之ModelForm代码详解
2017/10/26 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Python中函数参数匹配模型详解
2019/06/09 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
python多进程重复加载的解决方式
2019/12/13 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
医院竞聘演讲稿
2014/05/16 职场文书
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers
Redis+AOP+自定义注解实现限流
2022/06/28 Redis