一个关于希尔排序中插入排序执行方法的问题

上次老师上课的时候讲到一个问题,就是在执行希尔排序的时候,只是将希尔序列加上了插入排序.
但是在这里插入排序的进入方式有两个不同的实现方案:

1.先提取出序列中所有的间隔为gap的序列,然后按照插入排序进行操作

def shell_sort(num_list,gap):#这是一个处理不同步长排序的东西
    for i in range(len(num_list)):#一个个遍历
        kk=i+((len(num_list)-i)//gap*gap) #这个代表这个字符串会走到的最远的路
        for mm in range(i,kk,gap):
            for j in range(mm,i,-gap):
                if num_list[j-gap]>num_list[j]:
                    num_list[j-gap],num_list[j]=num_list[j],num_list[j-gap]

2.不是按照一个一个序列进行,而是按照1–>n的距离前进,每个值都往前做一个插入排序

def shell_sort2(num_list,gap):
    for i in range(gap,len(num_list)):
        tmp=num_list[gap]
        j=i
        while j!=0 and num_list[j-gap]>tmp:
            num_list[j]=num_list[j-gap]
            j=j-gap
        num_list[j]=tmp

哪个更快?


方案二更快
在这里插入图片描述
其实虽然循环的次数应该是一样的,但是难道是因为每次都需要做i+gap的跨度导致速度慢?
具体不知道

全部代码

import time
import random

def random_int_list(start, stop, length):#生成随机数组
    start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
    length = int(abs(length)) if length else 0
    random_list = []
    for i in range(length):
        random_list.append(random.randint(start, stop))
    return random_list

def shell_sort(num_list,gap):#这是一个处理不同步长排序的东西
    for i in range(len(num_list)):#一个个遍历
        kk=i+((len(num_list)-i)//gap*gap) #这个代表这个字符串会走到的最远的路
        for mm in range(i,kk,gap):
            for j in range(mm,i,-gap):
                if num_list[j-gap]>num_list[j]:
                    num_list[j-gap],num_list[j]=num_list[j],num_list[j-gap]
#这里的主要步骤👆
#1.截取多个在gap上的数值,一次进行排序:如1,3,5,7,9序号的一次排序完
#2.缩减gap,并进行循环

# #以这样的步骤进行:👇
#1.从gap开始,慢慢走,如走到3,到1的位置有1gap,做完比较滞后直接把3往后走一个
#2.当走到5的时候,再次返回到3,1,并再次排序
def shell_sort2(num_list,gap):
    for i in range(gap,len(num_list)):
        tmp=num_list[gap]
        j=i
        while j!=0 and num_list[j-gap]>tmp:
            num_list[j]=num_list[j-gap]
            j=j-gap
        num_list[j]=tmp
            

def whole_sort(num_list,gap,sort_fuc):#进行循环
    while gap>0:
        sort_fuc(num_list,gap)        
        gap=gap//2
    return num_list

arr=random_int_list(1,999,999999)
a=0
startt=time.time()
# print(startt)
while a<100: 
    whole_sort(arr,3,shell_sort2)
    a+=1
print(time.time()-startt)
del startt
a=0
startt=time.time()
while a<100: 
    whole_sort(arr,3,shell_sort2)
    a+=1
print(time.time()-startt)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值