基本思路:
1.以一个数为基准(中间的数),比基准小的放到左边,比基准大的放到右边
2.再按此方法对这两部分数据分别进行快速排序(递归进行)
3.不能再分后退出递归,并重新将数组合并
let arr=[3,45,65,66,12,33,45,66]
function quickSort(arr){
//这是最关键的一点,若数组长度为一或小于一时不做操作直接返回
if(arr.length<=1){
return arr
}
let len=Math.floor(arr.length/2)
//获取基准数 可以是任意一个 这里我取的中间数,并将其在数组中删除掉
let provit=arr.splice(len,1)[0]
let left=[];let right=[];
//将数组分为左右两个部分,比基准小的放左边大的放右边
arr.forEach((item)=>{
if(item<provit){
left.push(item)
}else{
right.push(item)
}
})
console.log(left,right)
//左右部分用基准数连接起来
return quickSort(left).concat([provit],quickSort(right))
}
let sortArr=quickSort(arr)
console.log(sortArr)//[3, 12, 33, 45, 45, 65, 66, 66]
此外还可以用此种思路解决多维数组转化为一维数组:
let arr1=[1,2,[3,4,[5,6]]]
function ff(arr){
let sortArr=[]
arr.forEach((item)=>{
if(Array.isArray(item)){
//若数组中的一项是数组格式的话 则用递归方法拿到转化为一维的数组,将之用concat方法拼接起来
sortArr=sortArr.concat(ff(item))
}else{
sortArr.push(item)
}
})
return sortArr
}
console.log(ff(arr1))//[1,2,3,4,5,6]