1. 程式人生 > 實用技巧 >插入排序進階1---你想到了嗎?

插入排序進階1---你想到了嗎?

  將有監督的插入排序,優化為無監督的插入排序,尋找全域性最小值並將其放到開頭,所以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)