自认玄学的一道排序题???
这两天回头大复习,做了一下洛谷的一道题
知识点是手写快排加分治
P1923 【深基9.例4】求第 k 小的数
自己写的代码交了20篇整才照着题解写出来篇AC的(太屑了
然而还有好多问题没有闹明白
暂且记录一下
1 //AC代码 2 //感觉此题是道玄学题 3 #include <bits/stdc++.h> 4 using namespace std; 5 int n,k,a[5000005]; 6 void qsort(int l,int r){ 7 // if(l>=r)return ; 8 //加上会输出3,正确结果应为2,原因不明 9 int i=l,j=r,x=a[(l+r)/2]; 10 while(i<=j){//=保证i>j 11 while(a[i]<x)i++; 12 while(a[j]>x)j--; 13 if(i<=j){ 14 swap(a[i],a[j]); 15 i++; 16 j--; 17 } 18 } 19 //没有以下代码 60分 20 //分治,经过while以后,l<=j<i<=r(l==r除外 21 if(k<=j)qsort(l,j);//k在左区间,只关注左边 22 if(i<=k)qsort(i,r);//右区间 23 else{//k在j和i中间(j和i中间一定只有一个数,l==r除外 24 printf("%d",a[j+1]); 25 exit(0); 26 //不加exit会输出2 3,正确结果应仅有2 27 //exit(0)表示程序正常结束; 28 } 29 } 30 int main(){ 31 scanf("%d%d",&n,&k); 32 for(int i=0;i<n;i++){ 33 scanf("%d",&a[i]); 34 } 35 qsort(0,n-1); 36 return 0; 37 } 38 39 40 //错误代码 41 //#include <bits/stdc++.h> 42 //using namespace std; 43 //int n,k; 44 //const int maxn=5e6+5; 45 //int a[maxn]; 46 //void qsort(int l,int r){ 47 // if(l>=r)return ; 48 // int i=l-1,j=r+1,x=a[(l+r)/2]; 49 // while(i<=j){ 50 // do i++;while(a[i]<x); 51 // do j--;while(a[j]>x); 52 // //a[j]>=x会运行错误,原因不明 53 // if(i<=j)swap(a[i],a[j]); 54 // } 55 //// qsort(l,j); 56 //// qsort(j+1,r); 57 // //如果把j改成i会全部MLE,原因不明 58 // //如果没有以下优化会TLE两个点 59 // //!!! 60 //// if(k<j) qsort(l,j+1); 61 // //如果在数组左边,只遍历左边部分 62 // //!!!qsort(l,j)不输出,但是 qsort(l,j+1)就OK 63 // 64 //// else if(k>i) qsort(i+1,r); 65 // 66 //// else if(k>j) qsort(j+1,r); 67 // //如果在数组右边,只遍历右边部分 68 // //bug同上 69 //// else { 70 // //如果在中间,直接输出即可 71 //// printf("%d",a[j]); 72 //// } 73 // 74 // 75 // //优化后1AC,2WA,2MLE??? 76 // if(k>=i)qsort(i+1,r); 77 // else if(k<=j)qsort(l,j-1); 78 // else{ 79 // printf("%d",a[j]); 80 // } 81 //} 82 //int main(){ 83 // scanf("%d%d",&n,&k); 84 // for(int i=0;i<n;i++)scanf("%d",&a[i]); 85 // qsort(0,n-1); 86 //// printf("%d ",a[k]); 87 // return 0; 88 //}
吸氧以后原来的60分代码过了【doge】
1 #pragma G++ optimize(2)//开启O2优化 2 #include <bits/stdc++.h> 3 using namespace std; 4 int n,k; 5 const int maxn=5e6+5; 6 int a[maxn]; 7 void qsort(int l,int r){ 8 if(l>=r)return ; 9 int i=l-1,j=r+1,x=a[(l+r)/2]; 10 while(i<j){ 11 do i++;while(a[i]<x); 12 do j--;while(a[j]>x); 13 //a[j]>=x会运行错误,原因不明 14 if(i<j)swap(a[i],a[j]); 15 } 16 qsort(l,j); 17 qsort(j+1,r); 18 } 19 int main(){ 20 scanf("%d%d",&n,&k); 21 for(int i=0;i<n;i++)scanf("%d",&a[i]); 22 qsort(0,n-1); 23 printf("%d",a[k]); 24 return 0; 25 }