1235:输出前k大的数

输出前k大的数

写这题时还偶然发现以前写的优化快排居然是错误的。——》快速排序优化方案的否定

思路的话,大致就是快排的删减版,即减少不必要的分治。(25行)

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int N=100005;
 6 int k,n,a[N];
 7 int partition(int begin,int end){
 8     while(begin<end){
 9         while(begin<end&&a[begin]>=a[end])end--;
10         if(begin<end){
11             swap(a[begin],a[end]);
12             begin++;
13         }
14         while(begin<end&&a[begin]>=a[end])begin++;
15         if(begin<end){
16             swap(a[begin],a[end]);
17             end--;
18         }
19     }
20     return end;
21 }
22 void quickSort(int begin,int end){
23     int benchmark=partition(begin,end);
24     if(benchmark-1>begin)quickSort(begin,benchmark-1);
25     if(benchmark<k&&end>benchmark+1)quickSort(benchmark+1,end);
26 }
27 int main(){
28     cin>>n;
29     for(int i=1;i<=n;i++)
30         scanf("%d",&a[i]);
31     cin>>k;
32     quickSort(1,n);
33     for(int i=1;i<=k;i++)
34         printf("%d\n",a[i]);
35     return 0;
36 }

 

posted @ 2021-08-11 15:58  Rekord  阅读(664)  评论(0编辑  收藏  举报