python实现排序算法——计数排序

50 篇文章 2 订阅
46 篇文章 31 订阅
本文介绍了非比较类的计数排序算法,通过python代码实现。计数排序适用于整数排序,它通过预估数列范围创建相应列表,遍历数列后将元素归位,最后合并得到排序结果。虽然时间复杂度为O(n),但需要额外空间,且不适用于小数或范围大的整数排序。
摘要由CSDN通过智能技术生成

       使用python实现计数排序,计数排序和之前我们说过的插入排序,选择排序等都不一样,它是非比较类的排序。前面我们所讲的排序都是两两比较之后交换位置。

       计数排序主要的思想:假设我们有n个整数,范围是 [ x , y ] [x,y] [x,y],现在我们要对其进行排序。首先我们设置 ( y − x + 1 ) (y-x+1) (yx+1)个位置的列表,其中每一个位置都对应于一个数。在我们遍历了一次待排序的数列之后,我们也就将所有的数都放在了相应的位置里。接下来我们就只要把他们合并到一起就可以了。


算法举例

我们要对【1,3,1,2,6,9,8,0】排序,发现数组的范围是 [ 0 , 9 ] [0,9] [0,9],所以我们设置10个位置。
设计10个位置:【0,0,0,0,0,0,0,0,0,0】
位置所表示数:【0,1,2,3,4,5,6,7,8,9】
遍历一次结果:【1,2,1,1,0,0,1,0,1,1】

之后就是合并的过程,将【0】,【1,1】,【2】,【3】,【6】,【8】,【9】合并,所得即是结果【0,1,1,2,3,6,8,9】。


算法分析

       首先想明确的是计数排序是可以操作负整数的。但是没有办法操作小数。

       还有一点想说的是,我们在设置位置的时候一定要先获得最大值和最小值。很多教程都是只获得最大值,然后默认从0开始设置。这样的话,第一是不能操作负数,第二也会浪费很多空间,比如我有10000个数排序,但是它的范围就在8,9之间,这样前面的位置就都失去了意义。

       计数排序由于不需要比较,其算法的时间复杂度是 O ( n ) O(n) O(n)。但是确实需要很多额外的空间来操作。

方法平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度
计数排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k)

       最后计数排序是一个稳定的排序方法。


python实现
########################################################
#####                   计数排序                    #####
########################################################

def jishu(nums, order=1):
    max_num = max(nums)
    min_num = min(nums)
    extra = [0] * (max_num - min_num + 1)
    for n in nums:
        extra[n - min_num] = extra[n - min_num] + 1

    result = []
    for i in range(len(extra)):
        if extra[i] != 0:
            result = result + ([min_num + i] * extra[i])

    if order == 1:
        return result
    else:
        return result[::-1]

test = [-2, 4, 6, 9, 0, 76, 21, 87, 65, 43, 32]
print(jishu(test))
print(jishu(test,0))
"""
[-2, 0, 4, 6, 9, 21, 32, 43, 65, 76, 87]
[87, 76, 65, 43, 32, 21, 9, 6, 4, 0, -2]
"""
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值