快速排序的时间复杂度为 O(n2)
排序流程
1、首先设定一个分界值(比如数组最中间的元素),通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。
3、对左侧和右侧的数据按1和2的逻辑不断执行,直至排序完成。
代码范例 1 — 使用 splice
/**
* 快速排序(使用 splice)
* @param arr 原数组
* @returns 排序的数组
*/
function quickSort1(arr) {
let length = arr.length
if (length <= 1) return arr
const midIndex = Math.floor(length / 2) // 中间的 index
const midValue = arr.splice(midIndex, 1)[0] // 中间的值。splice 会修改数组
const left = []
const right = []
// 注意这里使用 arr.length ,arr 被修改了
for (let i = 0; i < arr.length; i++) {
const n = arr[i]
if (n < midValue) {
// 小于 midValue ,则放在左侧
left.push(n)
} else {
// 大于等于 midValue ,则放在右侧
right.push(n)
}
}
return quickSort1(left).concat(
[midValue],
quickSort1(right)
)
}
代码范例 2 — 使用 slice
/**
* 快速排序(使用 slice)
* @param arr 原数组
* @returns 排序的数组
*/
function quickSort2(arr) {
const length = arr.length
if (length <= 1) return arr
const midIndex = Math.floor(length / 2) // 中间的 index
const midValue = arr.slice(midIndex, midIndex + 1)[0] // 中间的值。注意,使用 slice,原数组没有改动
const left = []
const right = []
for (let i = 0; i < length; i++) {
if (i !== midIndex) {
const n = arr[i]
if (n < midValue) {
// 小于 midValue ,则放在左侧
left.push(n)
} else {
// 大于等于 midValue ,则放在右侧
right.push(n)
}
}
}
return quickSort2(left).concat(
[midValue],
quickSort2(right)
)
}