JavaScript的排序算法

1:基本概念

时间复杂度:算法执行所耗费的时间。

这个复杂度直接和样本的个数有关,复杂度反映了算法的性能,一般来说,复杂度越低,算法所消耗的时间越短。

/* O(N1) */
    for (var i = 0; i < data.length; i++) {
        ...
    }
    
    /* O(N2) */
    for (var i = 0; i < data.length; i++) {
        for (var j = 0; j < data.length; j++) {
            ...
        }
    }

空间复杂度:运行一个程序所需内存的大小。

空间复杂度和时间复杂度是对立的,比如说,时间复杂度越高,空间复杂度越低;反之则相反。

内排序:所有排序操作都在内存中完成。

2:常用的排序算法

冒泡排序(Bubble Sort)

基本概念:依次比较相邻的两个数,将小数放在前面,大数放在后面。

时间复杂度:O(N2)。

实现原理:重复的走访要排序的数列,一次比较两个元素,大的元素放后面,如果它们的顺序错误就把它们交换过来。

代码实现:有两层循环嵌套,外循环遍历数组的每一项,内循环用于两两元素的比较,每次内循环减1。

function bubbleSort(arr) {
        var length = arr.length;
        for (var i = 0; i < length; i++) {
            for (var j = 0; j < length - 1 - i; j++) {
                if (arr[j] > arr[j+1]) {
                    [arr[j], arr[j+1]] = [arr[j+1], arr[j]];  
                }
            }
        }
        return arr;
    }

选择排序(Selection Sort)

时间复杂度:O(N2)。

实现原理:从未排序的序列中找到最小(大)的元素存放到指定的起始位置,再从未排序的序列元素中重复上一步,直至排序完成。

代码实现:两层循环嵌套,外循环遍历数组的每一项,内循环用于找到样本里面的最小值或者最大值,每次内循环减1。

function selectionSort(arr) {
        var length = arr.length;
        var minIndex, temp;
        for (var i = 0; i < length - 1; i++) {
            minIndex = i;
            for (var j = i + 1; j < length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            [arr[minIndex], arr[i]] = [arr[i], arr[minIndex]];
        }
        return arr;
    }

快速排序(Quick Sort)

时间复杂度:O(N * log2N)。

实现原理:通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列。

代码实现:找到一个数作为参考,然后比这个数字大的放在数字左边,比它小的放在右边,分别再对左右两边的序列做相同的操作。

function partition(arr, low, high) {
      let pivot = arr[low];
      while (low < high) {
        while (low < high && arr[high] > pivot) {
          --high;
        }
        arr[low] = arr[high];
        while (low < high && arr[low] <= pivot) {
          ++low;
        }
        arr[high] = arr[low];
      }
      arr[low] = pivot;
      return low;
    }
    function quickSort(arr, low, high) {
      if (low < high) {
        let pivot = partition(arr, low, high);
        quickSort(arr, low, pivot - 1);
        quickSort(arr, pivot + 1, high);
      }
      return arr;
    }

插入排序(Insertion Sort)

时间复杂度:O(N2)。

实现原理:构建一个有序序列,未排序数据在已排序序列中从后向前扫描,找到正确位置插入。

代码实现:两层循环嵌套,创建已排序数组, 起始包含数组的第一个元素,比这个数字大的放在数字左边, 比它小的放在右边。

function insertSort(arr) {
        for(let i = 1; i < arr.length; i++) {
            for(let j = i; j > 0; j--) {
                if(arr[j] < arr[j-1]) {
                    [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
                } else {
                    break;
                }
            }
        }
        return arr;
    }

通过怎么样的学习,才能成为合格的WEB前端工程师?如果现在的你很迷茫,可以+web前端扣扣裙:956766604 免费网课在线学习以及问题解答、项目指导服务,配合强大的学习工具,带你完成九大实战项目,经历从零基础到专业前端工程师的完美蜕变。


欢迎初学和进阶中的小伙伴。956766604。群里有免费的学习资料,还有专业老师为你解惑,更有免费体验课、免费直播课等福利不定期放送。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值