快速排序
注意:
- 需要稳定排序算法
下面的代码窃以为更适合这题,但是不能过。
因为快速排序并不是稳定的算法。
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 }