counting sort適用於排列分布比較集中的資料, 即最大值和最小值相差不會太大,具體這個差在多少合適,還是以後值得我思考的問題??
計數排序的演算法思想是需要分配3個陣列,original, counter[original], counter[i] = counter[i]+counter[i-1], 即計數為小於等於本身值的個數,通過從累加小於i的項,
最後依照counter作為pos, 將original分布到result中, 再將result拷貝到original
result[counter[original[k]]-1] = original[k];
counter[original[k]]--;
演算法分析:
1.時間複雜度為 o(n)。
2.空間複雜度為 o(n)。
3.計數排序不是原地排序演算法(指不申請多餘的空間來進行的排序);
是穩定排序演算法(指在排序前後具有相同關鍵字之間的相對順序保持不變);
1. c++實現的源**如下:
class countsort //計數排序類
;
countsort::countsort():length(len)
} int *counter = new int[max+1];//counter陣列記錄陣列中每個元素出現的次數, 0-max
memset(counter,0,(max+1)*sizeof(int)); //assign space and init it to 0
int *result = new int[max+1]; //result陣列存放排好序的元素
memset(result,0,(max+1)*sizeof(int));
//step1: map original[i] as the mark of counter
for(int i = 0; i sort();
cout<
2 .由於空間申請了o(3n), 所以需要對空間進行優化,合併step 2,3,4,
} int *counter = new int[max+1];//counter陣列記錄陣列中每個元素出現的次數, 0-max
memset(counter,0,(max+1)*sizeof(int)); //assign space and init it to 0
//step1: map original[i] as the mark of counter
for(int i = 0; i 0)
}delete counter;
}3. 更進一步的優化演算法
如果最大數和最小數基數很大,但是|max-min| 差別比較小,或者出現了負數的時候怎麼處理。
可以通過雜湊函式來代替第一步值與counter索引對映。original[i]= xi, counter[j]
對於直接對映即j=xi,所以h(xi) = xi;
那麼如果是max和min都是正數,且min本身就很大,
j = xi-min=h(xi), 如果min是負數,這個問題留到以後再解決吧。。。
現在基於上面的**進行驗證。我們生成1000-2000的隨機數, 如果令index = original[i], 那麼現在的index = original[i] -min,
**實現如下
void countsort::sort()
if(original[i]< min)
}int length2 = max - min +1;
int *counter = new int[length2];//counter陣列記錄陣列中每個元素出現的次數, 0-max
memset(counter,0,(length2)*sizeof(int)); //assign space and init it to 0
int *result = new int[length]; //result陣列存放排好序的元素
memset(result,0,(length)*sizeof(int));
//step1: map original[i] as the mark of counter
for(int i = 0; i
//step 2: accumulate counter
for(int j = 1; j <= length2 -1; j++)
//step 3: distribute counter to result
for(int k = 0; k < length; k++)
//step4:copy result to original, has equal length
for(int m = 0; m < length; m++)
delete counter;
delete result;
}
排序演算法(五) 線性時間排序之計數排序
計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。當k o n 時,計數排序的執行時間為o n 計數排序的基本思想是 對於每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到輸出陣列中的位置上了。例如,如果有17個元素小於x則x就應該放在第18個位置上...
排序演算法之計數排序
今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...
演算法 排序之計數排序
最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...