插入排序進階1---你想到了嗎?
阿新 • • 發佈:2020-09-14
將有監督的插入排序,優化為無監督的插入排序,尋找全域性最小值並將其放到開頭,所以j不可能=0,固可去掉監督項j>=0。經過優化後可以看出演算法在時間效率上有了一定的提升。
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)