经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
js常见排序算法实现
来源:cnblogs  作者:linxuhan  时间:2021/1/4 9:40:06  对本文有异议

1.冒泡排序

原理:对数组进行遍历,根据相邻两个元素大小进行交换,每一次遍历都将最小值推至最前方,然后对剩下的值再次进行比较

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:稳定

  1. // 冒泡排序
  2. function bubbleSort(arr) {
  3. let len = arr.length - 1, tmp
  4. for (let i = 0; i < len; i++) {
  5. for (let j = 0; j < len - i; j++) {
  6. if (arr[j] > arr[j + 1]) {
  7. tmp = arr[j]
  8. arr[j] = arr[j + 1]
  9. arr[j + 1] = tmp
  10. }
  11. }
  12. }
  13. return arr
  14. }

2.快速排序

原理:从数组中取一个基准值,将剩下的值与基准值比较,小于的放到左边,大于的放到右边,并对左右两边进行快速排序,重复直到左右两边只剩一个元素,最后合并

平均时间复杂度O(nlogn)

最坏时间复杂度:O(n^2)

空间复杂度:O(nlogn)

稳定性:不稳定

  1. // 快速排序
  2. function quickSort(arr) {
  3. let len = arr.length
  4. if (len < 2) {
  5. return arr;
  6. }
  7. let index = Math.floor(len / 2);
  8. let pindex = arr.splice(index, 1)[0]; // 去除基准值
  9. let left = [], right = [];
  10. arr.forEach(item => {
  11. if (item > pindex) {
  12. right.push(item);
  13. } else {
  14. left.push(item);
  15. }
  16. })
  17. return quickSort(left).concat([pindex], quickSort(right))
  18. }

 3.插入排序

原理:将数组分成两个,一个是已排序,一个是待排序,将待排序中的元素与已排序的元素进行比较并插入到适当位置

最好时间复杂度:O(n),当数组已经由小到大排序好

最坏时间复杂度:O(n^2),当数组是由大到小排序,与冒泡排序相同

空间复杂度:O(1)

稳定性:稳定

  1. // 插入排序
  2. function insertSort(arr) {
  3. let len = arr.length;
  4. let prev, cur;
  5. for (let i = 1; i < len; i++) {
  6. prev = i - 1;
  7. cur = arr[i];
  8. while(prev >= 0 && arr[prev] > cur) {
  9. arr[prev + 1] = arr[prev];
  10. prev--;
  11. }
  12. arr[prev + 1] = cur;
  13. }
  14. return arr;
  15. }

4.希尔排序

原理:将整个数组通过设置步长分为一个个分块,对每个分块进行序列化,最后进行一次插入排序

时间复杂度:O(nlogn)~O(n2),一般为O(n^1.5),数组有序程度越高,排序越快

空间复杂度:O(1)

稳定性:不稳定

  1. // 希尔排序
  2. function shellSort(arr) {
  3. let len = arr.length;
  4. let tmp;
  5. let gap = Math.floor(len / 2);
  6. while(gap > 0) {
  7. for (let i = gap; i <len; i++) {
  8. for (let j = i; j >= gap && arr[j] < arr[j - gap]; j -= gap) {
  9. tmp = arr[j];
  10. arr[j] = arr[j - gap];
  11. arr[j - gap] = tmp;
  12. }
  13. }
  14. gap = Math.floor(gap / 2);
  15. }
  16. return arr;
  17. }

5.选择排序

原理:从数组第一个元素开始,与后面所有元素进行比较,如果有比其小的值,则交换两者位置

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:不稳定

  1. // 选择排序
  2. function selectSort(arr) {
  3. let len = arr.length;
  4. let index, tmp;
  5. for (let i = 0; i < len; i++) {
  6. index = i;
  7. for (let j = i + 1; j < len; j++) {
  8. if (arr[index] > arr[j]) {
  9. index = j;
  10. }
  11. }
  12. tmp = arr[index];
  13. arr[index] = arr[i]
  14. arr[i] = tmp
  15. }
  16. return arr
  17. }

 6.归并排序

原理:将数组拆分成短序列进行排序,然后把各个有序的短序列合并成一个

时间复杂度:O(nlogn)

空间复杂度:O(1)

稳定性:稳定

  1. // 归并排序
  2. function mergeSort(arr) {
  3. if (arr.length < 2) {
  4. return arr;
  5. }
  6. let mid = Math.floor(arr.length / 2);
  7. let left = arr.slice(0, mid);
  8. let right = arr.slice(mid);
  9. return merge(mergeSort(left), mergeSort(right));
  10. }
  11. function merge(left, right) {
  12. console.log(right);
  13. let arr = [];
  14. while(left.length && right.length) {
  15. if (left[0] <= right[0]) {
  16. arr.push(left.shift());
  17. } else {
  18. arr.push(right.shift());
  19. }
  20. }
  21. while(left.length) {
  22. arr.push(left.shift());
  23. }
  24. while(right.length) {
  25. arr.push(right.shift());
  26. }
  27. return arr
  28. }

 

原文链接:http://www.cnblogs.com/lxuhan/p/14214099.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号