基本思想:【摘自演算法導論第三版p108】
對每乙個輸入元素x,確定小於x的元素的個數。利用這一資訊,就可以直接把x放到它在輸出陣列中的位置上了。
serial code for sorting an array of 8-bit unsigned numbers:
void countingsort( unsigned char* a, unsigned long a_size )
; // count array is initialized to zero by the compiler
for( unsigned long i = 0; i < a_size; i++ )
count[ a[ i ] ]++;
// fill the array with the number of 0's that were counted, followed by the number of 1's, and then 2's and so on
unsigned long n = 0;
for( unsigned long i = 0; i < numberofcounts; i++ )
for( unsigned long j = 0; j < count[ i ]; j++ )
a[ n++ ] = (unsigned char)i;
}
test code:
#include #include using namespace std;
typedef unsigned int uint;
const int numdata = 100;
const uint k = 256;
void countsort(vector& inputvec)
void printdata(vector&testvec)
int main()
cout << "test data before sorting : " << endl;
printdata(testvec);
// counting sort
countsort(testvec);
cout << "test data after sorting : " << endl;
printdata(testvec);
return 0;
}
小結:計數排序比較適合取值範圍k比較小而資料量很大的情形( k << n)
parallel counting sort 參考:
cuda counting sort:
1. 待排序資料從cpu拷貝到gpu (gpu only 操作可忽略一次資料傳輸開銷, 建議:use host pinned memory)
2. 計數陣列的初始化 (for gpu only scenario, 分配一次,然後每一次排序前use cudamemset 恢復初值)
3. 計數統計
4. 填充輸出陣列
5. 已排序資料從gpu拷貝回cpu(gpu only 操作可忽略一次資料傳輸開銷, 建議:use host pinned memory)
to be continued...
演算法筆記之 計數排序
適合整數排序,以及數值較小的情況。當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,...
python計數排序 Python 計數排序
1.python coding utf 8 def counting sort a,b,k 計數排序,偽碼如下 counting sort a,b,k 1 for i 0 to k 初始化儲存區的值 2 do c i 0 3 for j 1 to length a 為各值計數 4 do c a j ...
排序 計數排序
資料結構和演算法系列目錄 不斷更新 計數排序是一種線性時間的排序,它的時間複雜程度為o n 雖然是線性的時間複雜程度,但是它的空間複雜程度比較高,而且用之前需要有乙個硬性的前提。這個前提在後面給出,這裡先來簡單介紹一下計數排序。計數排序是先掃瞄一邊待排序陣列,並用乙個輔助陣列記錄待排序每個元素應該在...