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