数据结构 希尔排序 计数排序 堆排序

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)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值