这里的快排 是一种稍微改进的快排,即减少一些不必要的交换次数。
quick_sort:
void quick_sort(int s, int e){
if(s >= e) return; //终止条件
int x = a[s];
int i = s,j = e;
while(i < j){
while(i < j && a[j] >= x)
--j;
while(i < j && a[i] <= x)
++i;
int t = a[i]; a[i] = a[j] ; a[j] = t;
}
a[s] = a[i]; //此时 i == j 为最后找到的最小的数,需要放在枢轴处(即位置s)
a[i] = x;
quick_sort(s,i-1);
quick_sort(i+1,e);
}
第K小
int kth_min(int s, int e, int k){
if(s <= e){ // 终止条件
int x = a[s];
int i = s, j = e;
while(i < j){
while(i < j && a[j] >= x) --j;
while(i < j && a[i] <= x) ++i;
int t = a[i]; a[i] = a[j]; a[j] = t;
}
a[s] = a[i];
a[i] = x;
if(i-s+1 == k)
return a[i];
else if(i-s+1 < k)
kth_min(i+1,e,k-(i-s+1));
else
kth_min(s,i-1,k);
}
}
第K大
int kth_max(int s,int e, int k){
if(s <= e){ //终止条件
int x = a[s];
int i = s, j = e;
while(i < j){
while(i < j && a[j] >= x) --j;
while(i < j && a[i] <= x) ++i;
int t = a[i]; a[i] = a[j]; a[j] = t;
}
a[s] = a[i];
a[i] = x;
if(e-i+1 == k)
return a[i];
else if(e-i+1 < k)
kth_max(s,i-1,k-(e-i+1));
else
kth_max(i+1,e,k);
}
}
完整code:
#include<iostream>
using namespace std;
int a[100];
void quick_sort(int s, int e){
if(s >= e) return; //终止条件
int x = a[s];
int i = s,j = e;
while(i < j){
while(i < j && a[j] >= x)
--j;
while(i < j && a[i] <= x)
++i;
int t = a[i]; a[i] = a[j] ; a[j] = t;
}
a[s] = a[i];
a[i] = x;
quick_sort(s,i-1);
quick_sort(i+1,e);
}
int kth_min(int s, int e, int k){
if(s <= e){ // 终止条件
int x = a[s];
int i = s, j = e;
while(i < j){
while(i < j && a[j] >= x) --j;
while(i < j && a[i] <= x) ++i;
int t = a[i]; a[i] = a[j]; a[j] = t;
}
a[s] = a[i];
a[i] = x;
if(i-s+1 == k)
return a[i];
else if(i-s+1 < k)
kth_min(i+1,e,k-(i-s+1));
else
kth_min(s,i-1,k);
}
}
int kth_max(int s,int e, int k){
if(s <= e){ //终止条件
int x = a[s];
int i = s, j = e;
while(i < j){
while(i < j && a[j] >= x) --j;
while(i < j && a[i] <= x) ++i;
int t = a[i]; a[i] = a[j]; a[j] = t;
}
a[s] = a[i];
a[i] = x;
if(e-i+1 == k)
return a[i];
else if(e-i+1 < k)
kth_max(s,i-1,k-(e-i+1));
else
kth_max(i+1,e,k);
}
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; ++i){
cin >> a[i];
}
quick_sort(0,n-1);
for(int i = 0; i < n; ++i)
cout << a[i] << " ";
cout << endl;
cout << kth_min(0,n-1,3) << endl;
cout << kth_max(0,n-1,3) << endl;
return 0;
}