十大排序算法——计数排序

以下内容是个人学习笔记的整理。

原理:
桶排序的思想,只是桶排序的一种特例。

步骤:

  1. 定义一个列表,用于统计代排序列每个数据出现的次数;
  2. 对上述列表元素按从左往右的顺序累加;
  3. 定义一个列表,用于存放排序后的序列;
  4. 从原序列最后的元素开始扫描,对应的计数列表中的值-1为排序列表的下标,对应的值为排序列表对应的值。

实现代码(python):

import itertools

def counting_sort(alist):
    '计数排序,适应于数据比较大,但是数据范围比较小的场景'
    if len(alist) <= 1:
        return alist
    #定义一个列表,用于统计每个元素出现的次数
    counts = [0] * (max(alist) + 1)
    for num in alist:
        counts[num] += 1
    
    #顺序累加 
    counts = list(itertools.accumulate(counts))   
    
    #定义一个列表,用于存放排序后的列表
    sorted_list = [0] * len(alist)
    #从原列表最后开始扫描列表,对应的计数列表中的值-1为排序列表的下标,对应的值为排序列表对应的值
    for i in reversed(alist):
        index = counts[i] - 1
        sorted_list[index] = i
        counts[i] -= 1
        
    alist[:] = sorted_list
    return alist

复杂度分析:
-空间复杂度
空间复杂度为O(n)

-时间复杂度
–最优时间复杂度:O(n)
–最坏时间复杂度:O(nlogn)
–平均时间复杂度:O(n)

是否属于原地排序算法:
不是一种原地排序算法

稳定性:
稳定

适应范围:
适应外部排序,即数据量比较大,但是数据范围比较小的排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值