js数组排序算法 快速排序法

原理:

判断元素个数,若元素为空或只有1个元素,则无需排序。

否则就将第一个元素作为基准值,将数组拆分为2个数组,一个大于基准值的,一个小于基准值的。

利用递归算法,继续将上面的2个数组分别继续执行,即可得到全部排序过的新数组。

快速排序是冒泡排序的改进版。

js实现代码:

// 快速排序
function qsort(arr) {
  if (arr.length < 2) {// 没有元素或只有1个元素 无需排序
    return arr;
  } else {
    const piv = arr[0] // 第一个元素作为基准值
    let Larr = [], Rarr = []; //左侧 < 基准值数组 右侧 > 基准值数组
    for (let i = 1; i < arr.length; i++) {
      if (arr[i] < piv) {
        Larr.push(arr[i])
      } else {
        Rarr.push(arr[i])
      }
    }
    // 递归调用qsort 结果返回新数组
    return [...qsort(Larr), piv, ...qsort(Rarr)]
  }
}
const arr = qsort([5, 6, 100, 30, 50, 10, 1, 5, 3, 9, 10])
console.log(arr) // [1, 3, 5, 5, 6, 9, 10, 10, 30, 50, 100]

此时大O为O(n),因为存在递归,需要开新栈空间,有空间复杂度。

大O更小的一种方式是每次都将中间一个元素作为基准值,也就是配合二分法,这样每次for的次数将减少一半,大O为O(logn)

posted @ 2021-06-04 10:48  herry菌  阅读(649)  评论(0编辑  收藏  举报