1. 计数排序
计数排序需要知道所有元素的范围,主要思想是:统计出每个数字出现了几次,存至C中,然后将C中的数字转为小于该数字的元素个数,然后从后往前依次填写,是稳定的排序方法。python实现如下:
def count_sort(A, k):
"""
计数排序
:param A:待排序列
:param k:元素范围
"""
C = [0 for i in range(k)]
B = [0 for i in range(len(A))]
for i in range(len(A)):
C[A[i]-1] += 1
for j in range(1,k):
C[j] = C[j] + C[j-1]
for i in range(len(A)-1, -1,-1):
B[C[A[i]-1]-1] = A[i]
C[A[i] - 1] = C[A[i]-1] - 1
return B
if __name__ == "__main__":
list = [3,2,4,2,1,5,4,3,6,4,5]
print list
list_sorted = count_sort(list, 6)
print list_sorted
2.基数排序
基数排序针对多位数,从低位往高维排序,python实现为:
def stable_sort(A, d, k):
"""
计数排序
:param A:待排序列
:param d:待排位数
:param k:元素范围
"""
A_index = [(A[i] / 10 ** d) % 10 for i in range(len(A))]
C = [0 for i in range(k+1)] # 考虑 0-9 k=9 C需要有坐标0-9 10个
B = [0 for i in range(len(A))]
for i in range(len(A)):
C[A_index[i]] += 1
for j in range(1, k+1):
C[j] = C[j] + C[j - 1]
for i in range(len(A) - 1, -1, -1):
B[C[A_index[i]] - 1] = A[i]
C[A_index[i]] = C[A_index[i]] - 1
return B
def radix_sort(A, d):
"""
基数排序
:param A:待排序列
:param d:元素位数
"""
for i in range(d):
A_temp = stable_sort(A, i, 9) # 对第i位进行稳定排序
A = A_temp
return A
if __name__ == "__main__":
list = [329, 457, 657, 839, 436, 720, 355]
print list
list_sorted = radix_sort(list, 3)
print list_sorted
3. 桶排序
桶排序假设数组元素均匀分布,且知道区间范围,将范围划分为n个等分区间,给我感觉有点像哈希存储,python实现为:
def insert_sort(list):
"""插入排序"""
for i in range(1, len(list)):
j = i
while j > 0:
if list[j] < list[j-1]:
list[j],list[j - 1] = list[j-1],list[j]
j -= 1
else:
break
def bucket_sort(A):
"""桶排序"""
n = len(A)
B = [[] for i in range(n)]
for i in range(n):
B[int(math.floor(n*A[i]))].append(A[i])
for i in range(n):
insert_sort(B[i])
C = []
for i in range(n):
C.extend(B[i])
return C
if __name__ == "__main__":
list = [0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68]
print list
list_sorted = bucket_sort(list)
print list_sorted