計數排序是桶排序的乙個特例,即:桶的大小為1。這樣一來,分桶之後,每個桶內部就不需要排序了,只需將不同桶的資料合併到一起,組成排序好的序列。計數排序對資料的要求十分嚴格:
找出原始陣列l中最大的元素值max;
構造乙個計數陣列count,count的下標為從0到max,儲存的值為原陣列中元素值等於下標的元素個數,如:count[i]的值為l中i的個數;
對count進行累加,即:i從0到max,do:
從後往前遍歷l,將l中的元素逐個重定位,放入重定位之後的陣列中;
def countsort(l):
n = len(l)
max_l = max(l)
# 構造計數陣列count,長度為max_l+1
count = [0]*(max_l+1)
for i in range(n):
count[l[i]] += 1
# 進行累加計數
for i in range(1,max_l+1):
count[i] = count[i-1]+count[i]
# 使用輔助陣列r對原始陣列l中每個元素重定位
r = [0]*n
for i in range(n-1,-1,-1):
count[l[i]] -= 1
r[count[l[i]]] = l[i]
print("第%d次排序後: "%(n-i),r)
# 覆蓋原始陣列
l = r
l = [3,2,0,2,3,1,2,1]
print("原始序列: ",l)
countsort(l)
原始序列: [3, 2, 0, 2, 3, 1, 2, 1]
第1次排序後: [0, 0, 1, 0, 0, 0, 0, 0]
第2次排序後: [0, 0, 1, 0, 0, 2, 0, 0]
第3次排序後: [0, 1, 1, 0, 0, 2, 0, 0]
第4次排序後: [0, 1, 1, 0, 0, 2, 0, 3]
第5次排序後: [0, 1, 1, 0, 2, 2, 0, 3]
第6次排序後: [0, 1, 1, 0, 2, 2, 0, 3]
第7次排序後: [0, 1, 1, 2, 2, 2, 0, 3]
第8次排序後: [0, 1, 1, 2, 2, 2, 3, 3]
資料結構與演算法 計數排序
排序的思路常規的就是基於比較,比如常見的快排,冒泡等,這種排序最快也是onlogn。非比較的排序思路基本是用乙個輔助陣列,把待排陣列的元素大小作為索引放入輔助陣列,用輔助陣列的位置來記錄大小,空間換時間。適用場景 待排元素的值有乙個範圍,並且範圍是可以接受的。方法 這裡會涉及幾個引數,作為接受引數,...
資料結構與演算法 計數排序
計數排序 counting sort 是一種穩定的線性時間排序演算法。該演算法於1954年由 harold h.seward 提出。計數排序使用乙個額外的陣列c 其中第i個元素是待排序陣列a中值等於i的元素的個數。然後根據陣列c來將a中的元素排到正確的位置。當輸入的元素是 n 個 0 到 k 之間的...
資料結構與演算法筆記(十二)排序
就是讓一組無序資料變成有序的過程。一般預設這裡的有序都是從小到大的排列順序 衡量乙個排序演算法的優劣,主要從三個角度分析 時間複雜度 包括最好時間複雜度 最快時間複雜度 平均時間複雜度 空間複雜度 如果空間複雜度為1,也叫原地排序 穩定度 是指相等的資料物件,在排序之後,順序能否保持不變 1.原理 ...