数组快速排序方法

592 阅读1分钟

基本思路:

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]