与之前讲的快速排序算法基本一致,只不过我们找到第K个数的时候就要返回这个数值,不用将整个数组排完。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int arr[N],n,k;
int quick_sort(int arr[],int left,int right,int k){
if(left >= right) return arr[left];
int x = left,i = left - 1,j = right + 1;
while(i < j){
do i++;while(arr[i] < arr[x]);
do j--;while(arr[j] > arr[x]);
if(i < j) swap(arr[i],arr[j]);
}
if(j - left + 1 >= k) return quick_sort(arr,left,j,k);
else return quick_sort(arr,j+1,right,k - (j - left + 1));
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n >> k;
for(int i = 0;i < n;i++) cin >> arr[i];
cout << quick_sort(arr,0,n-1,k);
return 0;
}
尤其要注意在进行下一层递归的时候,判断条件是和
关系!其中递归函数的参数
发生了变化。