一種簡單的實現是得到陣列c,c[i]表示陣列a中值為i的元素個數。
c = 就表示兩個0,兩個2,三個3,乙個5。
然後將這些數字依次存到陣列b中。
#include
#include
void printarray(int, int);
void counting_sort(int a, int b, int len, int k)
int main(void) ;
int b[8];
int k = 5;
counting_sort(a, b, 8, k);
printarray(b, 8);
return 1; }
void printarray(int array, int len)
這樣簡單的實現可以處理簡單的整型陣列的排序,但是對於有衛星資料的物件來說,
直接遍歷陣列c輸出結果的方法是行不通的。不能直接建立新的元素當做結果,
而需要挪到輸入陣列a中的元素。
《演算法導論》中的實現如下:保證結果與輸入陣列中元素的關聯,以及穩定性。
// a = , len = 8, k = 5
void counting_sort(int a, int b, int len, int k)
int j;
for (j = 0; j < len; j++)
c[a[j]] += 1;
// c[i]表示陣列a中小於等於值為i的元素個數
// 即c[a[j]] - 1即為元素應在b中的下標
// c =
int i;
for (i = 1; i <= k; i++)
c[i] += c[i - 1];
// 從len - 1到0遍歷陣列a,保證穩定性
for (j = len - 1; j >= 0; j--) }
習題8.2-4,先使用計數排序花費n+k時間得到陣列c,
然後區間[a, b]內的數字個數就是c[b] - c[a-1]。(a=0時,c[0] = 0)
例如上面例子中a = ,
c = ,[0, 5] = c[5] - 0 = 8
[1, 3] = c[3] - c[1-1] = 7 - 2 = 5。
演算法導論 第8章 線性時間排序
比較排序指在排序的最終結果各元素的次序依賴於它們之間的比較的排序演算法。在最壞情況下,任何比較排序演算法都需要做 nlgn 次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。本章討論三種用運算而不是比較來確定排序順序的線性時間複雜度的排序演算法 計數排序假設n個輸入元素中的每乙個都是在0 k...
演算法導論 第8章 線性時間排序 計數排序
計數排序 n個元素都是0到k範圍得整數,當k o n 時,排序執行時間為o n 思想 對於數x,確定小於x的個數m,將x放在第m 1個位置上 例子 假設3個元素小於x,那麼x應該放在4上 輸入第一行的第乙個數n是陣列的個數,第一行第二個數表示所有n的元素中最大的數k 接下來的第二行就是n個數字 輸入...
演算法導論第8章線性時間排序 Python實現
計數排序 def counting sort a,b,k c 0 for i in range k length len a for i in range length c a i 1for i in range 1 k c i c i c i 1 for i in range k c i 1 fo...