常用的 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面向对象之四 继承
Feb 08 Javascript
顶部缓冲下拉菜单导航特效的JS代码
Aug 27 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
JavaScript中用toString()方法返回时间为字符串
Jun 12 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
Dec 07 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
Apr 25 Javascript
详解如何更好的使用module vuex
Mar 27 Javascript
面试题:react和vue的区别分析
Apr 08 Javascript
JavaScript判断浏览器运行环境的详细方法
Jun 30 Javascript
Vue中常用rules校验规则(实例代码)
Nov 14 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 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访问数组最后一个元素的函数end()用法
2015/03/18 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
js获取url参数的使用扩展实例
2007/12/29 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
实现python版本的按任意键继续/退出
2016/09/26 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Numpy数组的保存与读取方法
2018/04/04 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
python实现单机五子棋
2020/08/28 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
shell变量的作用空间是什么
2013/08/17 面试题
党校学习思想汇报
2014/01/06 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
小小商店教学反思
2014/04/27 职场文书
医院搬迁方案
2014/06/14 职场文书
实习指导老师意见
2015/06/04 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python