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

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

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

步骤:

  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)

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

稳定性:
稳定

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

你可能感兴趣的:(学习笔记)