计数排序基数排序桶排序
Posted 一件风衣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序基数排序桶排序相关的知识,希望对你有一定的参考价值。
这篇文章是排序算法的最后一篇了,在前面的文章中,我们一起学习了几个非线性时间的基于比较的排序算法,而今天,我们将学习三个线性时间的非比较算法!
计数排序(Counting Sort)
我们之前提过,任何基于比较的排序算法,其理论上的时间复杂度下限为O(n*logn),而计数排序是一个O(n+k)的算法,思路是空间换时间,是个很好理解的算法。
(一)计数排序算法思想
(此处对原思想做了便于理解的修改)
计数排序算法堆输入的数据有一定的要求,需要满足这样一个条件:输入的数组的元素能取的值是有限的。假设输入的元素都取自集合S,S中元素的个数为k,输入的数组A长度为n。
集合S是有序的,我们对数组A进行遍历,对每个出现的元素分别计数,结果存放在S中。计数完成后,对S进行遍历,每个元素出现了多少次就输出多少个,最后将输出一个有序数组。
(二)计数排序算法图解
假设输入数组中的元素只能取自[0, 1, 2, 3, 4, 5, 6, 7, 8],输入数组以[5, 1, 0, 2, 3, 2, 5, 1, 6, 8, 4]为例,图解如下:
(三)计数排序算法的Python实现
# 计数排序算法
def CountingSort(A):
# B用于存放排序完成后的数组
# C用于计数,C[i]意味着A中元素i出现的次数为C[i]
B, C = (len(A))*[0],(max(A)+1)*[0]
# 遍历A,计数
for i in range(0, len(A)):
C[A[i]] += 1
k = 0
# 遍历C,每个i出现了几次,就在B中赋值几次
for i in range(0, len(C)):
for j in range(0, C[i]):
B[k] = i
k += 1
return B
if __name__ == "__main__":
array = [5, 1, 0, 2, 3, 2, 5, 1, 6, 8, 4]
print(CountingSort(array))
以上是关于计数排序基数排序桶排序的主要内容,如果未能解决你的问题,请参考以下文章