算法導論 排序

計數排序

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);

}

發佈了71 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章