计数排序
1, 速度很快, 唯一缺陷是计数长度列表和排序的最大数字相等, 如果排序中的数字实在太大了, 创建的列表太长了比如2的32次方
import random
def count_sort(li, max_count =21):
count = [0 for _ in range(max_count+1)]
for val in li:
count[val] += 1
li.clear()
for ind, val in enumerate(count):
for i in range(val):
li.append(ind)
li = [random.randint(0,20) for _ in range(8)]
random.shuffle(li)
print('排序前',li)
count_sort(li)
print('排序后',li)
2, 稍稍的改进,减少计数列表的的长度, 如果最小数实在太小, 无法减少
import random
def count_sort(li):
min ,max_count = li[0],li[0]
for i in li:
if i > max_count:
max_count = i
if i < min:
min = i
count = [0 for _ in range(max_count+1-min)]
for val in li:
count[val-min] += 1
li.clear()
for ind, val in enumerate(count):
for i in range(val):
li.append(ind+min)
li = [random.randint(10,20) for _ in range(8)]
random.shuffle(li)
print('排序前',li)
count_sort(li)
print('排序后',li)
3 不太好的,内外部变量li不同
import random
def count_sort(li):
min ,max_count = li[0],li[0]
for i in li:
if i > max_count:
max_count = i
if i < min:
min = i
min = 0
count = [0 for _ in range(max_count+1-min)]
for val in li:
count[val-min] += 1
count2 = [0 for _ in range(max_count + 1 - min)]
for i in range(1, len(count)):
count[i] += count[i-1]
li2 = [0 for _ in range(len(li))]
for i in range(len(li)-1,-1,-1):
z = li[i] - min
count[z] -= 1
li2[count[z]] = li[i]
li = li2
print('内部排序后', li2)
li = [random.randint(0,20) for _ in range(8)]
random.shuffle(li)
li = [4,1,3,4,3]
print('排序前',li)
count_sort(li)
print('排序后',li)
输出:
排序前 [4, 1, 3, 4, 3]
内部排序后 [1, 3, 3, 4, 4]
排序后 [4, 1, 3, 4, 3]
写入自己的博客中才能记得长久
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!