1. 程式人生 > >以空間換時間的計數排序

以空間換時間的計數排序

計數排序

    我們前面學習的插入、歸併、堆和快速排序都是比較排序,即在排序的最終結果中,各元素的次序依賴於它們之間的比較。我們說過比較排序有時間下界,即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)。