桶排序\基数排序\ python

1 # 桶排序要求:
2 # 有几个输入数据,要求对其进行从小到大或者从大到小进行排序
3
4 # 思路:
5 # 首先建立需要的桶,然后每个位置初始化,接着将需要处理的数据根据数值在相应位置设置值为这个值出现的次数
6 # 使用字典可能会更好一点,但是字典的排列是无序的,使用键值进行排序的话增加代码量

import random
def buckerSort(alist):
    _max = max(alist)
    _min = min(alist)
    s = [0 for _ in range(_min, _max+1)]
    for i in alist:
        s[i - _min] += 1
    i = 0
    for num, tem in enumerate(s):
        while tem>=1:
            alise[i] = num + _min
            i += 1
            tem -= 1
if __name__ == '__main__':
    a = [random.randint(0,100) for i in range(10)]
    print(a)
    bucketSort(a)
    print(a)

基数排序:
基数排序首先按照最低有效数字进行排序,然后由低位向高位进行。基数排序可以看做是进行多趟桶排序。每个有效数字都在0-9之间,很适合桶排序,建10个桶很方便。

import random
def radixSort():
    A=[random.randint(1,999) for i in range(10)]
    print(A)
    for k in range(3):  #3轮排序      
        s=[[] for i in range(10)]
        for i in A:
            s[i//(10**k)%10].append(i)
        print(k,s)
        A=[a for b in s for a in b]
        print(k,A)
        
    return A
print(radixSort())
[46, 186, 348, 2, 552, 267, 360, 88, 10, 217]
0 [[360, 10], [], [2, 552], [], [], [], [46, 186], [267, 217], [348, 88], []]
0 [360, 10, 2, 552, 46, 186, 267, 217, 348, 88]
1 [[2], [10, 217], [], [], [46, 348], [552], [360, 267], [], [186, 88], []]
1 [2, 10, 217, 46, 348, 552, 360, 267, 186, 88]
2 [[2, 10, 46, 88], [186], [217, 267], [348, 360], [], [552], [], [], [], []]
2 [2, 10, 46, 88, 186, 217, 267, 348, 360, 552]
[2, 10, 46, 88, 186, 217, 267, 348, 360, 552]

计数排序:
假设n个输入元素中每一个都是介于0到k之间的整数,此处k为某个整数。当k=O(n)时,计数排序的运行时间为Θ(n)。

对每一个数的元素x,确定出小于x的元素个数。有了这一信息就可以把x直接放到最终输出数组中的位置上。

import random
def countingSort(alist,k):
    n=len(alist)
    b=[0 for i in range(n)]
    c=[0 for i in range(k+1)]
    for i in alist:
        c[i]+=1
    print(c)
    for i in range(1,len(c)):
        c[i]=c[i-1]+c[i]
    print(c)
    for i in alist:
        b[c[i]-1]=i
        c[i]-=1
    return b
if __name__=='__main__':
    a=[random.randint(0,10) for i in range(10)]
    print(a)
    print(countingSort(a,10))
[6, 3, 4, 8, 6, 8, 0, 6, 7, 2]
[1, 0, 1, 1, 1, 0, 3, 1, 2, 0, 0]
[1, 1, 2, 3, 4, 4, 7, 8, 10, 10, 10]
[0, 2, 3, 4, 6, 6, 6, 7, 8, 8]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值