快速排序 #include using namespace std; const int maxn=1e6+7; int a[maxn],n; int Partition(int *a,int p,int r){ int i=p,j=r+1; int x=a[p]; while(1){ while(a[++i]<x&&i<r); while(a[--j]>x); if(i>=j) break; swap(a[i],a[j]); } a[p]=a[j];a[j]=x; return j; } void QuickSort(int *a,int p,int r){ if(p<r){ int q=Partition(a,p,r); QuickSort(a,p,q-1); QuickSort(a,q+1,r); } } int main(){ cin>>n; for(int i=0;i>a[i]; QuickSort(a,0,n-1); for(int i=0;i<n;i++) cout<<a[i]<<" "; return 0; }
随机化
#include using namespace std; const int maxn=1e6+7; int a[maxn],n; int Partition(int *a,int p,int r){ int i=p,j=r+1; int x=a[p]; while(1){ while(a[++i]<x&&i<r); while(a[--j]>x); if(i>=j) break; swap(a[i],a[j]); } a[p]=a[j];a[j]=x; return j; } int Random(int l,int r){ r++; return (rand()*rand()+rand())%(r-l)+l; } int RandomizedPartition(int *a,int p,int r){ int i=Random(p,r); swap(a[i],a[p]); return Partition(a,p,r); } void RandomizedQuickSort(int *a,int p,int r){ if(p<r){ int q=RandomizedPartition(a,p,r); RandomizedQuickSort(a,p,q-1); RandomizedQuickSort(a,q+1,r); } } int main(){ srand(time(0)); cin>>n; for(int i=0;i>a[i]; RandomizedQuickSort(a,0,n-1); for(int i=0;i<n;i++) cout<<a[i]<<" "; return 0; }
随机求第k小
#include using namespace std; const int maxn=1e6+7; int a[maxn],n,k; int Partition(int *a,int p,int r){ int i=p,j=r+1; int x=a[p]; while(1){ while(a[++i]<x&&i<r); while(a[--j]>x); if(i>=j) break; swap(a[i],a[j]); } a[p]=a[j];a[j]=x; return j; } int Random(int l,int r){ r++; return (rand()*rand()+rand())%(r-l)+l; } int RandomizedPartition(int *a,int p,int r){ int i=Random(p,r); swap(a[i],a[p]); return Partition(a,p,r); } int RandomizedSelect(int *a,int p,int r,int k){ if(p==r) return a[p]; int i=RandomizedPartition(a,p,r),j=i-p+1; if(k<=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); } int main(){ srand(time(0)); cin>>n>>k; for(int i=0;i>a[i]; cout<<RandomizedSelect(a,0,n-1,k)<<endl; return 0; }
线性时间求第k小
#include using namespace std; const int maxn=1e6+7; int a[maxn],n,k; int Partition(int *a, int p, int n, int beginval) { int temp, beginpos; for(int i = 0; p <= n - p + 1; ++i) if(a[p + i] == beginval) { beginpos = p + i; break; } temp = a[p]; a[p] = a[beginpos]; a[beginpos] = temp; temp = a[p]; while(p < n) { while(a[n] >= temp && p < n) --n; a[p] = a[n]; while(a[p] <= temp && p < n) ++p; a[n] = a[p]; } a[p] = temp; return p; } int Select(int *a,int l,int r,int k){ if(r-l<75){ sort(a+l,a+r); return a[l+k-1]; } int m=(r-l+1)/5; if(5*m!=r-l+1) m++; int i; for(i=0;i<m-1;i++){ sort(a+l+i*5,a+l+i*5+4); swap(a[l+i],a[l+i*5+2]); } sort(a+l+i*5,a+n); int midval=Select(a,l,l+m,m/2); int midpos=Partition(a,l,r,midval); int tmp=midpos-l+1; if(k<=tmp) return Select(a,l,midpos,k); else return Select(a,midpos+1,r,k-tmp); } int main(){ cin>>n>>k; for(int i=0;i>a[i]; cout<<Select(a,0,n,k); return 0; }