计数排序
void Sort(int a[],int& b[],int k) { int c[k]; for(int i=0;i<k;i++) { c[a[i]]++; //c[a[i]] 存储的是出现a[i]的个数 } for(int i=1;i<k;i++) { c[i]+=c[i-1];//比i还要小的数的总和 } for(int j=k-1;j>=0;j--) { b[c[a[j]]]=a[j]; c[a[j]]--; } }
桶排序用于 数据范围小,数据量大的情况下
选择第i大的数的线性算法
int patition(int a[],int p,int r) { int x=a[r]; int i=p-1; for(int j=p;j<r;j++) { if(a[j]<=x) { i++; swap(a[j],a[i]); } } swap(a[++i],x); return i; } int random_partition(int a[],int p,int r) { int j=p+rand()%(r-p); patition(a,p,j); swap(a[j],a[r]); return patition(a,p,r); } int Find(int a[],int p,int r,int i) { if(p==r) return a[p]; int j=random_partition(a,p,r); int k=j-p+1; if(k==i) return a[j]; else if(i<k) return Find(a,p,k-1,i); else return Find(a,k+1,r,i-k); }