將有監督的插入排序,優化為無監督的插入排序,尋找全域性最小值並將其放到開頭,所以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=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=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)
演算法高階 插入排序
說明 以下c 的實現參考嚴蔚敏的 資料結構 c語言版 實驗目的 有序列,其中把a視為key,按照key的大小使用插入排序對序列進行排序 演算法圖示 實驗 c10 1.cpp ifndef c10 1 h define c10 1 h include using namespace std defin...
演算法基礎 插入排序高階之希爾排序
我們分割待排序記錄的目的是減少待排序記錄的個數,並使整個序列向基本有序發展。而如上面這樣分完組後,就各自排序的方法達不到我們的要求。因此,我們需要採取跳躍分割的策略 將相距某個 增量 的記錄組成乙個子串行,這樣才能保證在子串行內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序。初始時,有乙...
插入排序演算法
插入排序演算法 思想 把排序過程看作是序列單個有序擴充套件為整體有序的過程,即首先取序列第二個元素與第乙個元素比較,將其插入合適位置,再將第三個元素與前兩個元素比較,將其插入合適位置,如此進行,直到最後取第n個元素與前n 1個元素進行比較並將其插入合適位置。演算法 建立日期 2004 12 14 插...