def insert_sort_gap(li,gap):
for i in range(gap,len(li)):
tmp = li[i]
j = i - gap
while j >= 0 and li[j] > tmp:
li[j+gap] = li[j]
j -= gap
li[j+gap] = tmp
def shell_sort(li):
d = len(li)//2
while d >= 1:
insert_sort_gap(li,d)
d //= 2
li = list(range(10))
import random
random.shuffle(li)
shell_sort(li)
print(li)
希尔排序的基本思想
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
相当于是先让序列整体有序起来,再进行冒泡排序
———————————————————————————————————————————
计数排序
def count_sort(li, max_count=100):#最大是100
count = [0 for _ in range(max_count + 1)]
#[[0 for i in range(L+1)]for j in range(K)]是什么意思
#用0 生成一个 (L+1 * K ) 大小的二维矩阵matrix
for val in li:#val代表数量
count[val]+=1
li.clear()
for ind,val in enumerate(count):
for i in range(val):
li.append(ind)
//enumerate()说明 enumerate()是python的内置函数 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串) enumerate将其组成一个索引序列,利用它可以同时获得 索引和值 enumerate多用于在for循环中得到计数
list1 = ["这", "是", "一个", "测试"]
for i in range (len(list1)):
print i ,list1[i]
1
2
3
上述方法有些累赘,利用enumerate()会更加直接和优美:
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
print index, item
>>>
0 这
1 是
2 一个
3 测试
enumerate还可以接收第二个参数,用于指定索引起始值
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1, 1):
print index, item
>>>
1 这
2 是
3 一个
4 测试
桶排序
对于一个个数庞大的序列,如1亿个数据,我们不好再用计数排序处理
这是想到,将这一亿个数分成n个100个数,每一百个数为一个桶,给每一个桶进行排序
def bucket_sort(li,n=100,max_num = 10000):
buckets = [[] for _ in range(n)] #每一百个数是一个桶
for var in li:
i = min(var // (max_num // n),n-1) #i 表示var放在几号桶里 ,0-99
buckets[i].append(var)#把var加到桶里
#保持桶内的顺序
for j in range(len(buckets[i])-1,0,-1):# 0 2 4 3
if buckets[i][j]<buckets[i][j-1]:
buckets[i][j],buckets[i][j-1] = buckets[i][j-1],buckets[i][j]
else:
break
sorted_li = []
for buc in buckets:#buc 是一维列表
sorted_li.extend(buc)
return sorted_li
//测试
import random
li = [random.randint(0,1000) for i in range(10000)]
li = bucket_sort(li)
print(li)