计数排序

def counting_sort(L, start, end):
    #用于计数,start表示L中最小的元素,end表示L中最大的元素
    len_start_to_end = end - start + 1
    c = [0 for i in range(len_start_to_end)]
    N = len(L)
    #统计每个元素出现的次数
    for element in L:
        c[element - start] += 1
    #将c[L[i]]重置为小于L[i]的元素个数
    for i in range(1,len_start_to_end):
        c[i] = c[i] + c[i - 1]
    b = [0 for i in range(N)]
    for element in L:
        b[c[element - start] - 1] = element
        c[element - start] = c[element - start] - 1
    L[:] = b[:]

if __name__ == '__main__':
    L = [23,41,12,32,24,31,45,35,41,24,15]
    counting_sort(L, 12, 45)
    print L

时间复杂度 Θ(k+n) ,k表示待排序元素最小值与最大值的范围,n表示元素个数。
k 非常大(远大于n)时,计数排序的效率就会下降。因此,计数排序适用于 k <script id="MathJax-Element-194" type="math/tex">k</script>值较小的情况。
计数排序具有稳定性(相等元素的相对位置不变)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值