计数排序

计数排序


其主要思想如下:

  1. 获取待排集合元素最大值 K K K,时间复杂度为: O ( n ) O(n) O(n) n n n 为元素个数;
  2. 建立一个数组 Counts[K+1],用于统计每个元素的个数;时间复杂度为 O ( n ) O(n) O(n)
  3. 基于 Counts[K],按顺序拼接待排元素。时间复杂度为 O ( K ) O(K) O(K);总的时间复杂度为: O ( K + 2 n ) O(K+2n) O(K+2n),去掉系数 O ( K + n ) O(K+n) O(K+n)

在这里插入图片描述

数组 的确立是解决排序问题的核心。


计数排序的特点


  1. 计数排序的时间复杂度为 O ( K + n ) O(K+n) O(K+n),主要操作为:寻找最大值、计数、拼接;
  2. 计数排序只对整数(可以转化为整数的类型)有效,对一定数据量( K K K不远大于 n n n值)的集合进行排序非常快,一般快于其他排序算法;
  3. 计数排序需要知道最大元素;
  4. 计数排序是稳定排序稳定;
  5. K K K 值远大于 n n n 值时(例如:1024>5,其中只要5个元素,但是最大值为1024),不仅耗费存储空间,也没有其他排序算法快。

计数排序代码示例:
#!/bin/bash

# 计数
def counts_sort(lst):
    sorted_lst = []
    counts = [0] * (max(lst) + 1)

 # 统计每个元素个数
    for e in lst:
        counts[e] += 1

 # 拼接出有序列表
    for value, num in enumerate(counts):
        sorted_lst.extend([value]*num)

    return sorted_lst

lists1 = [1, 6, 8, 3, 1, 5, 9, 2]
print(counts_sort(lists1))

结果:`[1, 1, 2, 3, 5, 6, 8, 9]`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值