python计数排序

这里写目录标题

1. 思路

1. 创建一个长度为列表长度+1 的新列表
2. 找出列表中元素出现的个数,并存储到新列表中
    比如列表为:1  3  1  2 6  5  6  1
         数    有几个
         0    0
         1    3
         2    1
         3    1
         4    0
         5    1
         6    2
3. 清除旧列表的所有元素,按照元素出现的个数,按照顺序依次添加到旧列表中

2. 代码1

def count_sort(li, max_num):
    count = [0 for i in range(max_num + 1)]
    for val in li:
        count[val] += 1  # 每个数字的个数
        print('count:', count)
    li.clear()
    for index, val in enumerate(count):# index代表数,val代表数量
        for i in range(val): # 遍历数量
            li.append(index) # 将数添加到列表中


import random

li = [1, 1, 2, 3, 4, 3, 4,  1, 3]
random.shuffle(li)
print(li)
count_sort(li, max(li))
print(li)

观察下面结果:

[4, 3, 3, 1, 1, 2, 4, 1, 3]
count: [0, 0, 0, 0, 1] 将第一次出现的数字4 加到新列表中,现在4的数量为1
count: [0, 0, 0, 1, 1] 将第一次出现的数字3 加到新列表中,现在3的数量为1
count: [0, 0, 0, 2, 1] 将第二次出现的数字3 加到新列表中,现在3的数量为2
count: [0, 1, 0, 2, 1] 将第一次出现的数字1 加到新列表中,现在1的数量为1
count: [0, 2, 0, 2, 1] 将第二次出现的数字1 加到新列表中,现在1的数量为2
count: [0, 2, 1, 2, 1] 将第一次出现的数字2 加到新列表中,现在2的数量为1
count: [0, 2, 1, 2, 2] 将第二次出现的数字4 加到新列表中,现在4的数量为2
count: [0, 3, 1, 2, 2] 将第三次出现的数字1 加到新列表中,现在1的数量为3
count: [0, 3, 1, 3, 2] 将第三次出现的数字3 加到新列表中,现在3的数量为3
[1, 1, 1, 2, 3, 3, 3, 4, 4]

enumerate解释:

enumerate:获取列表的下标和元素
li = [1, 1, 1, 2, 3, 3, 3, 4, 4]
for index, value in enumerate(li):
    print('下标:{}  元素:{}'.format(index, value))

在这里插入图片描述

3. 代码2

def count_sort(li):
    n = len(li)  # li列表长度
    num = max(li)  # li列表最大的元素
    # print(n,num)
    count = [0] * (num + 1)  # 创建一个新列表,长度为最大元素+1
    for i in range(0, n):
        count[li[i]] += 1  # 计算每个数字的个数
        print('count:', count)
    li = [] # 清空列表
    for i in range(0, num + 1): # 遍历列表长度,代表数
        for j in range(0, count[i]):# 遍历count列表,j代表这个数的数量
            li.append(i) #将这个数添加到列表中
    return li


li = [1, 1, 2, 3, 4, 3, 4, 1, 3]
print(li)
print(count_sort(li))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1024节

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

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

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

打赏作者

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

抵扣说明:

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

余额充值