排序算法-计数排序

计数排序(Counting sort)是一种稳定的排序算法。

计数排序使用一个额外的数组C,其 中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到 正确的位置。它只能对整数进行排序。

 

 


import random


def counting_sort(data_list):
    length = len(data_list)
    # 定义桶
    bucket = []
    max = data_list[0]
    for d in data_list:
        if d > max:
            max = d

    # 初始化
    for i in range(max + 1):
        bucket.append(0)

    # 计数
    for i in range(length):
        bucket[data_list[i]] = bucket[data_list[i]] + 1

    # 累加
    for i in range(1, max+1):
        bucket[i] = bucket[i] + bucket[i-1]

    # 计数排序,定义结果数组并初始化
    result = [0 for _ in range(length)]
    print("result:", result)
    print("data_list:", data_list)
    print("bucket:", bucket)

    # 从尾到头查找分数在result的插入位置,如果从头到尾的话就不是稳定的排序算法
    for i in range(length - 1, -1, -1):
        result[bucket[data_list[i]] - 1] = data_list[i]
        bucket[data_list[i]] = bucket[data_list[i]] - 1

    # 将结果复制到原来的数组中,达到修改数组的效果
    for i in range(length):
        data_list[i] = result[i]


data_list = [random.randint(0, 100) for i in range(10)]
print("原始data_list:", data_list)
counting_sort(data_list)
print("排序后的data_list:", data_list)

计数排序适用场景

计数排序只能用在数据范围不大的场景中,如果数据范围 k 比要排序的数据 n 大很多,就不适合用计数排序了。而且,计数排序只能给非负整数排序,如果 要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值