以空間換時間的計數排序
阿新 • • 發佈:2019-01-25
計數排序
我們前面學習的插入、歸併、堆和快速排序都是比較排序,即在排序的最終結果中,各元素的次序依賴於它們之間的比較。我們說過比較排序有時間下界,即nlgn,如果我們需要一個時間複雜度為O(n)的排序演算法,要怎麼辦?
計數排序就是比較好的選擇。計數排序的基本思想是:對每一個輸入的元素x,確定小於x的元素個數。利用這一資訊可以直接把x放到它的輸出陣列中的位置上。
這就要求我們需要很大的空間去儲存臨時變數。假設對於有n個元素的陣列,每一個元素都是在0到k區間內的一個整數,並需要一個與輸入陣列一樣大的輸出陣列。
void count_sort(int *a,int *b,int n,int k)
{
int c[k]={0};
//count the element nums
for(int i=0;i<n;i++)
c[a[i]]=c[a[i]]+1;
for(int i=1;i<k;i++)
c[i]+=c[i-1];
for(int i=n-1;i>=0;i--)
{
b[c[a[i]]-1]=a[i];
c[a[i]]-=1;
}
}
我們可以看成計數排序的時間複雜度是O(n),但是空間複雜度是O(n+k)。