Python实现八大排序算法(三:O(n)特殊排序篇--计数、基数排序)

7. 计数排序(Counting Sort)

7.1。 核心思想

“统计每个元素的出现次数,直接计算最终位置”

7.2. 关键概念

  • 非比较排序:通过统计而非比较确定位置
  • 适用范围:整数且范围较小的数据集
  • 空间换时间:需要额外计数数组

7.3. 算法步骤

  1. 找出数组中的最大值max_val
  2. 创建计数数组count,大小为max_val+1
  3. 统计每个元素出现次数
  4. 累加计数数组得到元素最终位置
  5. 反向填充结果数组保持稳定性

7.4 Python实现

7.4.1. 保持稳定性版(保持原始顺序)

特殊需求对非基础类型排序时,可以用这种保持稳定性的方法

def counting_sort(arr):
    if not arr:
        return
    
    # 找出最大值(不用max函数)
    max_val = arr[0]
    for num in arr[1:]:
        if num > max_val:
            max_val = num
    
    # 统计频率
    count = [0] * (max_val + 1)
    for num in arr:
        count[num] += 1
    
    # 计算累计分布
    i = 1
    while i <= max_val:
        count[i] += count[i-1]
        i += 1
    
    # 反向填充
    temp = [0] * len(arr)
    k = len(arr) - 1
    while k >= 0:
        num = arr[k]
        temp[count[num]-1] = num
        count[num] -= 1
        k -= 1
    
    # 写回原数组(不用返回值)
    for i in range(len(arr)):
        arr[i] = temp[i]

7.4.2. 不保持稳定性版(会打乱相同元素的顺序)

一般对简单类型排序,没有必要保持稳定性,程序可以稍微简单些

def counting_sort(arr):
    if not arr:
        return
    
    # 找出最大值(不用max函数)
    max_val = arr[0]
    for num in arr[1:]:
        if num > max_val:
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dudly

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

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

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

打赏作者

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

抵扣说明:

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

余额充值