概述
这里的快排 是一种稍微改进的快排,即减少一些不必要的交换次数。
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;
}
最后
以上就是酷酷帽子为你收集整理的快速排序 、 第K大 、 第K小的问题的全部内容,希望文章能够帮你解决快速排序 、 第K大 、 第K小的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复