原理:
判断元素个数,若元素为空或只有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)