计数排序-Python实现

def CountingSort(seq):
    """
    进行一次累加操作之后,
    对于存在数个相等的元素a[x]
    其中最后一个a[x]记作a[x]_last,即在 a[x] 中处于最右边位置
    则在排序后,有 (cnt[i] - 1) 即为 a[x]_last 前面存在的元素个数。
    保证排序结果的稳定
    """
    n = len(seq)
    max_num = max(seq)
    min_num = min(seq)
    res = [0 for ele in seq]
    cnt = [0 for ele in range(min_num,max_num+1)] # 找到计数数组的最小长度
    for i in range(n):
        cnt[seq[i]-min_num] += 1
    for i in range(1,max_num+1-min_num):
        cnt[i] += cnt[i-1] # 将数组的计数结果合并累加起来,从而形成连续的位置索引
    for i in range(n-1,-1,-1):
        item = seq[i] - min_num # 找到正确位置(因为cnt可以理解成下标从seq的最小数开始的)
        pos = cnt[item]-1 # cnt[item]-1直接记录当前它是第几个(从0开始)
        res[pos] = item + min_num # 恢复原数
        cnt[item] -= 1 # (解决相同数的问题)
    return res

CountingSort( [5,8,3,8,10,7,9] )
res: [3, 5, 7, 8, 8, 9, 10]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值