王树森说 -- 聊聊不一样的"计数排序"

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)

 

稳定性:稳定

 

原因在于:我们的中间列表元素增加是按照顺序依次遍历,所以相同元素增加到中间列表也是同样顺序增加的。

这个特点在业务环境中有很大的作用。



以上是关于王树森说 -- 聊聊不一样的"计数排序"的主要内容,如果未能解决你的问题,请参考以下文章

单视频播放量超20万的公开课配套教材,猫书来了~

单视频播放量超20万的公开课配套教材,猫书来了!

快速串联 RNN / LSTM / Attention / transformer / BERT / GPT

重复造轮子系列--计数,基数排序

高考分数排序之计数排序

计数排序