計數排序
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);
}