計數排序筆記

2021-06-16 16:42:35 字數 1610 閱讀 5832

基本思想:【摘自演算法導論第三版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 雖然是線性的時間複雜程度,但是它的空間複雜程度比較高,而且用之前需要有乙個硬性的前提。這個前提在後面給出,這裡先來簡單介紹一下計數排序。計數排序是先掃瞄一邊待排序陣列,並用乙個輔助陣列記錄待排序每個元素應該在...