固定思路
找到中间位置
遍历数组 小于中间位置放在左侧,否则放右侧
继续递归,最后concat拼接返回
splice
function quickSort1(arr:number[]):number[]{
const length=arr.length
if(length===0) return arr
const midIndex=Math.floor(length/2)
const midValue=arr.splice(midIndex,1)[0]
const left:number[]=[]
const right:number[]=[]
//这里不能直接用length 而是arr.length 因为arr已经被splice修改
for(let i=0;i<arr.length;i++){
const n=arr[i]
if(n<midValue){
left.push(n)
}else{
right.push(n)
}
}
return quickSort1(left).concat(
[midValue],
quickSort1(right)
)
}
slice
function quickSort2(arr:number[]):number[]{
const length=arr.length
if(length===0) return arr
const midIndex=Math.floor(length/2)
const midValue=arr.slice(midIndex,midIndex+1)[0]
const left:number[]=[]
const right:number[]=[]
for(let i=0;i<length;i++){
const n=arr[i]
if(i!=midIndex){
if(n<midValue){
left.push(n)
}else{
right.push(n)
}
}
}
return quickSort1(left).concat(
[midValue],
quickSort1(right)
)
}
splice slice 这两者在二分中时间复杂度区分不出来
splice 是逐步二分之后执行的,二分会快速削减数量级
如果是单独比较效果会非常明显