Pycharm实行按规律计数排序算法排序python源码

计数排序算法:

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), 如归并排序,堆排序。

基本函数01定义如下:

def count_sort(input_list):
    length = len(input_list)
    if length < 2:
        return input_list
    max_num = max(input_list)
    count = [0] * (max_num + 1)
    for element in input_list:
        count[element] += 1
    output_list = []
    for i in range(max_num + 1):
        for j in range(count[i]):
            # count[i]表示元素i出现的次数,如果有多次,通过循环重复追加
            output_list.append(i)
    return output_list

算法核心思想:
计数排序对输入的数据有附加的限制条件:
1、输入的线性表的元素属于有限偏序集S;
2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。
在这两个条件下,计数排序的复杂性为O(n)。


# 计数排序算法
def CountingSort(arr, maxValue):
    bucketLen = maxValue+1
    bucket = [0]*bucketLen
    sortedIndex =0
    arrLen = len(arr)
    for i in range(arrLen):
        if not bucket[arr[i]]:
            bucket[arr[i]]=0
        bucket[arr[i]]+=1
    for j in range(bucketLen):
        while bucket[j]>0:
            arr[sortedIndex] = j
            sortedIndex+=1
            bucket[j]-=1
    return arr

if __name__ == '__main__':
    Li = [9, 82, 17, 6, 5, 4, 3, 2, 11, 85, 6, 36, -2, -34, 29]
    print("source is:", Li)
    res = CountingSort(Li,max(Li))
    print("sort01 is:", res)
    print("sort02 is:", res[::-1])

运行结果如下:

source is: [9, 82, 17, 6, 5, 4, 3, 2, 11, 85, 6, 36, -2, -34, 29]
sort01 is: [2, 3, 4, 5, 6, 6, 9, 11, 17, 29, 36, 52, 82, 84, 85]
sort02 is: [85, 84, 82, 52, 36, 29, 17, 11, 9, 6, 6, 5, 4, 3, 2]

Process finished with exit code 0

参考资源:https://blog.csdn.net/u014597198/article/details/91395700

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海宝7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值