快速排序思想:
相当于:你是体育委员,面前站着一排人。怎么快速地按身高排好序?只需要不停地重复一句话:以某人为基准,比他小的都站到他前边,比他大的都站到后边。
选择数组中间索引的元素作为基准,对其余数组元素,遍历这些除基准外的元素,比基准小的元素,放进left数组里;比基准大的元素,放进right数组里。然后对left数组进行相同的操作(快排),也对right数组进行快排,然后把排完序的left连接上基准,和排完序的right。
如果某次进入函数,数组的长度为1,那就可以直接返回这个数组。还有一种情况是,如果某次选择的基准是最大的或最小的,那么right或left就是空数组了,长度为0,这时也可以直接返回这个空数组。所以,递归的出口条件就是,数组的长度小于等于1.
为什么这种规律可以做到数组排序?因为每次选择基准后,比基准小的都到前边去了,比基准大的都到它后边去了,虽然left和right数组还有可能是无序的,但是基准的位置是确定了的。
let quickSort= array =>{
if (array.length<=1){return array}
let pivotIndex=Math.floor(array.length/2) //Math.floor向下取整
let pivot=array.splice(pivotIndex,1)[0] //直接splice返回的是被删除那个元素的数组形式,加一个[0]获取元素
let left=[]
let right=[]
for (let i=0;i<array.length;i++){
if (array[i]<pivot){
left.push(array[i])
}else{
right.push(array[i])
}
}
return quickSort(left).concat(pivot,quickSort(right))
}
时间复杂度:O(n log2n)