js 实现数组的快递排序
思路是固定的
- 随便取一个值 midValue 作为比较的对象,可以取数组中间的值, 也可以取第一个值
- 定义临时存放的数组,存放比较的值, 小于 midValue 的 放left 大于的放right
- 返回 递归调用 left 和 right 的链接值
- 如果不去重的化, 再定义个中间 变量midary , 相等的push 这个数组。返回的值 也链接上中间值
代码实现
- 去重
function quicksort (arr: number[]):number[] {
const length = arr.length;
if (length === 0) return arr
let midIndex = Math.floor(length/2)
let midValue = arr[midIndex]
let leftArr : number[] = []
let rightArr:number[] = []
for (let i=0; i< length;i++) {
if (arr[i] < midValue) {
leftArr.push(arr[i])
}else if (arr[i] > midValue) {
rightArr.push(arr[i])
}
}
return quicksort(leftArr).concat(midValue,quicksort(rightArr))
}
- 不去重
function quicksort (arr: number[]):number[] {
const length = arr.length;
if (length === 0) return arr
let midIndex = Math.floor(length/2)
let midValue = arr[midIndex]
let leftArr : number[] = []
let rightArr:number[] = []
let midArr:number[] = []
for (let i=0; i< length;i++) {
if (arr[i] < midValue) {
leftArr.push(arr[i])
}else if (arr[i] > midValue) {
rightArr.push(arr[i])
}else if (arr[i] === midValue) {
midArr.push(arr[i])
}
}
return quicksort(leftArr).concat(midArr).concat(quicksort(rightArr))
}
复杂度分析
首先外面遍历的复杂度为O(n) 遍历的里面嵌套二分 复杂度为O(logn) 合在一起的复杂度为 O(nlogn)
取中间值
两个方式 一个是slice 一个是splice
在操作数组中 splice 的复杂度是比 slice 高的. 但是放到上面的快速排序中,因为有二分的影响,和本身算法的时间复杂度就比较高,的情况下,对时间复杂度影响不大