文章**
計數排序:
今天學習了計數排序,貌似計數排序的複雜度為o(n)。很強大。他的基本思路為:
1. 我們希望能線性的時間複雜度排序,如果乙個乙個比較,顯然是不實際的,書上也在決策樹模型中論證了,比較排序的情況為nlogn的複雜度。
2. 既然不能乙個乙個比較,我們想到乙個辦法,就是如果我在排序的時候就知道他的位置,那不就是掃瞄一遍,把他放入他應該的位置不就可以了嘛。
3. 要知道他的位置,我們只需要知道有多少不大於他不就可以了嗎?
4. 以此為出發點,我們怎麼確定不大於他的個數呢?我們先來個約定,如果陣列中的元素都比較集中,都在[0, max]範圍內。我們開乙個max的空間b陣列,把b陣列下標對應的元素和要排序的a陣列下標對應起來。這樣不就可以知道不比他大的有多少個了嗎?我們只要把比他小的位置元素個數求和,就是不比他大的。例如:a=;我們開乙個大小為8的陣列b,把a[0] = 3 放入b[3]中,使b[3] = 0; 同理 b[5] = 1; b[7] = 2;其他我們都設定為-1,哈哈我們只需要遍歷一下b陣列,如果他有資料,就來出來,鐵定是當前最小的。如果要知道比a[2]小的數字有多少個,值只需要求出b[0] – b[6]的有資料的和就可以了。這個0(n)的速度不是蓋得。
5. 思路就是這樣咯。但是要注意兩個數相同的情況a = ,這種情況就不可以咯,所以還是有點小技巧的。
6. 處理小技巧:我們不把a的元素大小與b的下標一一對應,而是在b陣列對應處記錄該元素大小的個數。這不久解決了嗎。哈哈。例如a = 我們開大小為5的陣列b;記錄陣列a中元素值為0的個數為b[0] = 0, 記錄陣列a中元素個數為1的b[1] = 1,同理b[2] = 1, b[3] = 2, b[4] = 1;好了,這樣我們就知道比a[4](4)小的元素個數是多少了:count = b[0] + b[1] + b[2] + b[3] = 4;他就把a[4]的元素放在第4個位置。
還是截張書上的圖:
7. 不過在程式設計的時候還是要注意細節的,例如我不能每次都來算一下比他小的個數。呵呵,思路就這樣了。奉上源**:
#include
#include
//計數排序
int countsort(
int* pdata,
int nlen)
//記錄排序記數。在排序的值相應記數加1。
for (
int i = 0; i
//確定不比該位置大的資料個數。
for (
int i = 1; i
int* psort = null;
//儲存排序結果的指標
psort = (
int*)malloc(
sizeof(
int) * nlen);
//申請空間
for (
int i = 0; i
//排序結束,複製到原來陣列中。
for (
int i = 0; i
//最後要注意釋放申請的空間。
free(pcout);
free(psort);
return 1; }
int main() ;
countsort(ndata, 10);
for (
int i = 0; i
printf("\n");
system("pause");
return 0; }
演算法 排序 計數排序
計數排序不是基於比較的排序演算法,其核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。計數排序 counting sort 是一種穩定的排序演算法。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i...
演算法 排序 計數排序
計數排序的核心思想就是將需要排序的陣列的元素轉為下標,在輔助空間陣列 輔助空間陣列的初始都是0 中找到對應元素的下標位置,將該位置的元素 掃瞄下標,將對應不為0的下標記錄賦值給原陣列,然後對應下標元素 圖例分析 具體 includevoid countsort int a,int len int m...
計數排序演算法
countsort.c include include include typedef int datatype typedef char numtype 有效個數 2至127 2 sizeof numtype 8 1 1 define limit numtype 1 sizeof numtype ...