王树森说 -- 聊聊不一样的"计数排序"
Posted 王树森说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王树森说 -- 聊聊不一样的"计数排序"相关的知识,希望对你有一定的参考价值。
前言
我就喜欢这么天上一脚低下一脚的,乱说一气,还有兴趣搞一个算法系列,你怎么看。
不服,咬我啊
计数排序完整代码
def jishu(alist):
# 如果列表不存在
if not alist:
return False
# 构造中间列表
L = [0] * (max(alist) - (min(alist) - 1))
# 中间列表增加内容
for i in range(len(alist)):
L[alist[i] - min(alist)] += 1
# 输出有序列表
result = []
for y in range(len(L)):
if L[y] != 0:
result += [y + min(alist)] * L[y]
return result
测试效果
if __name__ == "__main__":
li = [54,26,93,17,77,31,44,77,20]
print("处理前: %s" % li)
sortlist = jishu(li)
print("处理后: %s" % li)
print("新列表: %s" % sortlist)
时间复杂度
最优时间复杂度:O(n+k)
对于计数排序的代码来说,他主要是有两个遍历组成,第一个遍历和原列表alist元素个数相关,所以他的时间复杂度是O(n)
对于下面的这个中间列表遍历来说,由于列表元素的个数与原列表alist的最大值和最小值的差值密切相关,假设差值是k的话,那么该遍历的时间复杂度就是O(k)
对于整体来说,由于两个遍历是串行执行的,根据时间复杂度的顺序原则,计数排序的最优的时间复杂度是 O(n+k)
最坏时间复杂度:O(n+k)
因为计数排序是有两个简单的遍历循环顺序组成的,所以最坏时间复杂度和最优的时间复杂度一样,都是O(n+k)。
稳定性:稳定
原因在于:我们的中间列表元素增加是按照顺序依次遍历,所以相同元素增加到中间列表也是同样顺序增加的。
这个特点在业务环境中有很大的作用。
以上是关于王树森说 -- 聊聊不一样的"计数排序"的主要内容,如果未能解决你的问题,请参考以下文章