0
点赞
收藏
分享

微信扫一扫

4.算法之其他排序方法(希尔排序,计数排序,桶排序,基数排序)

兽怪海北 2022-04-06 阅读 88
python

1希尔排序

import random
def insert_sort_gap(li,gap):
    for i in range(gap,len(li)):
        temp=li[i]
        j =i -gap  
        while j >=0 and li[j]>temp:
            li[j+gap]=li[j]
            j-=gap
        li[j+gap]=temp
    return li
def shell_sort(li):
    d=len(li)//2
    while d>=1:
        insert_sort_gap(li,d)
        d//=2
    return li
li=[random.randint(0,100) for i in range(100)]
print(li)
print(shell_sort(li))

2.计数排序

import random
def count_sort(li,max):
    count=[0 for _ in range(max+1)] #建立空列表
    for val in li:
        count[val]+=1               #对每个数字出现的次数进行计数
    li.clear()
    print(count)
    for ind,val in enumerate(count): #遍历所存数据,val是ind出现的次数
        for i in range(val):
            li.append(ind)
li=[random.randint(0,10) for i in range(100)]
print(li)
count_sort(li,10)
print(li)

3.桶排序

def bucket_sort(li,n,maxnum):
    buckets=[[] for _ in range(n)]    #创建桶
    for val in li:
        i=min(val//(maxnum//n),n-1)   #确定数字所在的桶号数
        buckets[i].append(val)
        for j in range(len(buckets[i])-1,0,-1): #对每个桶内进行冒泡排序 从右往左冒泡
            if buckets[i][j]<buckets[i][j-1]:
                buckets[i][j],buckets[i][j-1]=buckets[i][j-1],buckets[i][j]
            else:
                break
    li.clear()
    for buc in buckets:
        li.extend(buc)
    return li
import random
li=[random.randint(0,100) for i in range(1000)]
print(li)
bucket_sort(li,10,100)
print(li)

4.基数排序

def rdix_sort(li):
    max_num=max(li)
    it=0
    while 10**it <=max_num:             #确定循环次数
        buckets=[[]for _ in range(10)]  #建桶
        for val in li:                  #遍历
            dig=(val//10**it)%10        #确定每个数放在哪个桶里
            buckets[dig].append(val)
        li.clear()
        for buc in buckets:            #把数重新取出
            li.extend(buc)
        it+=1
import random
li=[random.randint(0,10000) for i in range(1000)]
print(li)
rdix_sort(li)
print(li)
举报

相关推荐

0 条评论