快速排序

 

谁考了第k名

 

注意:

  • 需要稳定排序算法

 

下面的代码窃以为更适合这题,但是不能过。

因为快速排序并不是稳定的算法。

21.8.11更新:错误的真正原因:快速排序优化方案的否定

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int N=105;
 6 struct stu{
 7     double grade;
 8     int number;
 9 };
10 stu stus[N];
11 int k;
12 int partition(int begin,int end){
13     //确定基准值
14     stu tmp=stus[begin];
15     while(begin<end){
16         while(begin<end&&stus[begin].grade>=stus[end].grade)end--;
17         if(begin<end){
18             stus[begin]=stus[end];
19             begin++;
20         }
21         while(begin<end&&stus[begin].grade>=stus[end].grade)begin++;
22         if(begin<end){
23             stus[end]=stus[begin];
24             end--;
25         }
26     }
27     stus[end]=tmp;
28     return end;
29 }
30 void quickSort(int begin,int end){
31     //基准值benchmark左边所有值一定大于右边所有值
32     int benchmark=partition(begin,end);
33     //如果基准值等于k,直接返回即可
34     //如果基准值<k,答案一定位于左边,反之亦然
35     if(benchmark==k)return;
36     if(k<benchmark&&benchmark-1>begin)quickSort(begin,benchmark-1);
37     if(k>benchmark&&end>benchmark+1)quickSort(benchmark+1,end);
38 }
39 int main(){
40     int n;
41     cin>>n>>k;
42 
43     for(int i=1;i<=n;i++)
44         cin>>stus[i].number>>stus[i].grade;
45     quickSort(1,n);
46     //输出结果
47     printf("%d %g",stus[k].number,stus[k].grade);
48     return 0;
49 }

 

posted @ 2021-08-02 10:55  Rekord  阅读(20)  评论(0编辑  收藏  举报