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]