基本思想
- 分治法
- 每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
- 在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的,都是 O(n^2),它的平均时间复杂度为 O(nlogn) 。
直接上代码
const quickSort1 = function (arr, left, right) {
if (!(arr instanceof Array) || arr.length <= 1) {
return
}
if (left > right) return
let x = arr[left]
let i = left
let j = right
while(i != j) {
while(i < j && x <= arr[j]) {
j--
}
while (i < j && x >= arr[i]) {
i++
}
if (i < j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
arr[left] = arr[i]
arr[i] = x
quickSort1(arr, left, i-1)
quickSort1(arr, i+1, right)
}
const quickSort2 = function (arr) {
if (arr.length <= 1) return arr
let mid = Math.floor(arr.length / 2)
let midVal = arr[mid]
const left = []
const right = []
for (let i = 0; i < arr.length; i++) {
if (i === mid) continue
if (arr[i] < midVal) {
left.push(arr[i])
}
if (arr[i] >= midVal) {
right.push(arr[i])
}
}
return quickSort2(left).concat(midVal, quickSort2(right))
}
module.exports = {
quickSort1,
quickSort2
}
参考资料:《啊哈算法》