def counting_sort(L, start, end):
#用于计数,start表示L中最小的元素,end表示L中最大的元素
len_start_to_end = end - start + 1
c = [0 for i in range(len_start_to_end)]
N = len(L)
#统计每个元素出现的次数
for element in L:
c[element - start] += 1
#将c[L[i]]重置为小于L[i]的元素个数
for i in range(1,len_start_to_end):
c[i] = c[i] + c[i - 1]
b = [0 for i in range(N)]
for element in L:
b[c[element - start] - 1] = element
c[element - start] = c[element - start] - 1
L[:] = b[:]
if __name__ == '__main__':
L = [23,41,12,32,24,31,45,35,41,24,15]
counting_sort(L, 12, 45)
print L
时间复杂度
Θ(k+n)
,k表示待排序元素最小值与最大值的范围,n表示元素个数。
当
k
非常大(远大于
计数排序具有稳定性(相等元素的相对位置不变)。