快速排序的基本思路
function MySort( arr ) {
// 交换函数
const swap = (x, y) => {
let temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
// 分割数组,找到基准点
const partition = (left, right) => {
let len = right - left + 1;
if(len <= 1) return;
let first = arr[left];
while(left < right){
while(left < right && arr[right] >= first) --right;
swap(left, right);
while(left < right && arr[left] <= first) ++left;
swap(left, right);
}
return left
}
const quickSort = (left, right) => {
if(right - left <= 0) return;
const point = partition(left, right);
// 递归调用,对左子树组进行快速排序
quickSort(left, point-1);
// 递归调用,对右子树组进行快速排序
quickSort(point+1, right);
}
quickSort(0, arr.length-1);
return arr;
}
应用: 使用快速排序的思路找到数组中第K大的数
思路: 上面是从小到大排序,这里求第K大的数就改成从大到小排序,即将partition函数中的arr[right] >= first和arr[left] <= first符号进行对调。然后先找基准点,找到基准点point后,判断一下基准点的位置,
- 如果位置刚好是
K-1的话,说明这个数就是第K大的数,因为基准点左边的数都比它大,数组从0开始,直接返回该数值 - 如果位置小于
K-1的话,说明要找的数在基准点的右边,那么只需要再对右边的数组进行快排 - 如果位置大于
K-1的话,说明要找的数在基准点的左边,那么只需要对数组中基准点左边的数据进行快排 特殊情况是数组中只有一个元素的话,那么不需要排序了,直接返回这个数
function quickSort(left, right){
if(right - left <= 0) return a[left];
let partitionIndex = partition(left, right);
if(partitionIndex === K - 1) return a[partitionIndex];
if(partitionIndex < K-1) return quickSort(partitionIndex+1, right);
return quickSort(left, partitionIndex - 1);
}