思路:自我定位明确,意思就是说我这个元素应该站在什么位置,需要确定。怎么确定?当我左边的元素都比我小,我右边的元素都比我大时,不说其他元素,总之排序完成后我就是站在这个位置,当所有元素都完成自我定位,那排序也就完成了,所以我们只需要找到自我定位的索引即可。
画图软件真的用起来好累
借用人家的动图:
快速排序的重点是找出每个元素应该的索引
给出JS代码
function findIndex(arr, star, end) { // 定义找索引的函数
let i = star
let j = end
let x = arr[i] //基准值
while(i<j) { //只要头尾没重合,说明还没找完
// 找右边小于基准的值
while(i<j&&arr[j]>=x){ // 而且后面的值大于基准值
j-- // 从尾部开始的指针向前移动
}
if(i<j){ // 如果能跳出while循环说明小于基准值的元素找到了
arr[i] = arr[j] // 将找到的元素填入空位,该元素为空位
i++ // arr[i]就不考虑了
}
//找左边大于基准的值
while(i<j&&arr[i]<x) { // 如果小于基准就过
i++
}
if(i<j) {
arr[j] = arr[i] //将arr[i]填入空位
j-- //arr[j]不考虑了
}
}
arr[i] = x //完成所有填为之后,将取出的基准值填入最后一个空位,此时i=j
return i // 返回找到的索引
}
function qucikSort(arr, star, end){ //定义排序函数,递归方法
if(star<end) { //如果头尾没重合,说明还没有全部明确定位
let index = findIndex(arr, star, end)
quickSort(arr, star, index-1)
quickSort(arr, index+1, end)
}
}