快速排序-三段区间
快速排序是任意选择[left,right]区间内的某个值作为参考值,然后将小于该值的放在左边,大于该值的放在右边。在临界条件不满足的情况下,递归执行左区间和右区间的快排。
三段区间
使用两个游标将要排序的区间分为三部分:[left,seql]为小于该pivot的元素,[seql+1,seqr]为等于该pivot的元素,[seqr+1,right]为大于该pivot的元素
源代码:
public void quickSort(int[] nums,int left,int right){
//三段划分区间,进行排序
int seql = left-1,seqr = left-1;
if(left >= right){
return;
}
//seqr 下标是最后一个等于prios的值,seql是最后一个小于prios的值
int pivot = nums[left];
for(int i = left;i <= right;i++){
if(nums[i] < pivot){
swap(nums,++seqr,i);
swap(nums,seqr,++seql);
}else if(nums[i] == pivot){
swap(nums,++seqr,i);
}
}
if(seql > left){
quickSort(nums,left,seql);
}
if(seqr < right){
quickSort(nums,seqr+1,right);
}
}
扩展
可用于求解:
- 前k个最小值或者最大值;
- 数组中第k个最小元素;