資料結構與演算法(十二) 計數排序

2021-10-06 02:40:33 字數 1266 閱讀 5176

計數排序是桶排序的乙個特例,即:桶的大小為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.原理 ...