常用的 JS 排序算法 整理版

 更新时间:2018年04月05日 15:33:39   投稿:mdxy-dxy  
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较

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²)    | 不稳定 |
---------------------------------------------------------------

相关文章

  • js 设置选中行的样式的实现代码

    js 设置选中行的样式的实现代码

    设置选中的行样式的js代码,需要的朋友可以参考下,这里只给出了函数,具体的自己发挥。
    2010-05-05
  • js文件中调用js的实现方法小结

    js文件中调用js的实现方法小结

    JavaScript文件引用JavaScript文件的方法,需要的朋友可以参考下。
    2009-10-10
  • JS验证有效性示例

    JS验证有效性示例

    有效性验证的方法有很多,在本文将为大家介绍下如何使用js简单实现下,感兴趣的朋友可以参考下
    2013-10-10
  • Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果

    Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果

    这篇文章主要介绍了Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • knockoutjs模板实现树形结构列表

    knockoutjs模板实现树形结构列表

    这篇文章主要介绍了knockoutjs模板实现树形结构列表的实现代码,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-07-07
  • 微信小程序地图定位的实现方法实例

    微信小程序地图定位的实现方法实例

    小程序功能的强大想必使用过的人都知道,下面这篇文章主要给大家介绍了关于微信小程序地图定位的实现方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 完美解决手机网页中输入框被输入法遮挡的问题

    完美解决手机网页中输入框被输入法遮挡的问题

    下面小编就为大家分享一篇完美解决手机网页中输入框被输入法遮挡的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • js+div+css下拉导航菜单完整代码分享

    js+div+css下拉导航菜单完整代码分享

    本文主要分享了js+div+css下拉导航菜单的完整代码。可直接复制保存到HTML文件就可以体验效果。下面跟着小编一起来看下吧
    2016-12-12
  • 多浏览器兼容的动态加载 JavaScript 与 CSS

    多浏览器兼容的动态加载 JavaScript 与 CSS

    Omar AL Zabir这位MVP总是喜欢搞些稀奇古怪同时又很实用的小东西,并且还十分值得参考。最近他就做了一个叫做ensure的小工具用于动态加载JavaScript、CSS与HTML,而且IE、Firefox、Opera、Safari都支持了,那么我们就来看看ensure是如何做到动态加载JavaScript与CSS的。
    2008-09-09
  • 小程序实现日历效果

    小程序实现日历效果

    这篇文章主要为大家详细介绍了小程序实现日历效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论