将有监督的插入排序,优化为无监督的插入排序,寻找全局最小值并将其放到开头,所以j不可能=0,固可去掉监督项j>=0。由于原来的j>=0的判断的时间复杂度为n^2阶,经优化后时间复杂度为n阶,时间效率有所提高,这一点从程序的运行结果也可以看出。
import time
li1=[i for i in range(10)]
li=li1[::-1]
def insertsort1(li):
n = len(li)
for i in range(1,n):
temp=li[i] #先将待排序的最靠前的一个元素进行保存
j=i-1 #找到已经排好序的最后一个元素
while temp<li[j] and j>=0:#开始对temp代表的元素进行插入排序
li[j+1]=li[j]
j-=1
li[j+1]=temp
return li
def insertsort2(li):
n = len(li)
min=0
#寻找全局最小值的下标
for i in range(1,n):
if li[i]< li[min]:
min=i
#全局最小值放在最前面
while(min>0):
li[min],li[min-1]=li[min-1],li[min]
min-=1
for i in range(2,n):
temp=li[i] #先将待排序的最靠前的一个元素进行保存
j=i-1 #找到已经排好序的最后一个元素
while temp<li[j]:#开始对temp代表的元素进行插入排序;因为全局最小已经放在了开头,所以j不可能=0,固可去掉监督项j>=0。
li[j+1]=li[j]
j-=1
li[j+1]=temp
return li
start=time.time()
# print(insertsort1(li))
# 8.921818971633911
# 8.789137840270996
# 8.749927520751953
# 8.736004114151001
# 8.89368200302124
print(insertsort2(li))
# 7.535344123840332
# 7.505179166793823
# 7.654731512069702
# 7.606301307678223
# 7.568647146224976
end=time.time()
print(end-start)