python插入排序

插入排序的主要思想就是:
每次取得一個列表元素阁最,與已排序好的列表進行比較拱层,然后插入相應的位置,最終獲得排序好的列表绿渣。
意思是這樣的:
一個未排序的列表:
下標: 0 1 2 3 4
數組:[5,4,3,2,1]
我們把列表分成兩個部分seqOK,seqNo(只是在一個列表中劃分成兩個部分朝群,而不是截取成兩個列表),已排序好(seqOK)和未排序好(seqNo)的列表中符。
我們認為列表的第一個元素是已經排序好的姜胖,只要一個元素嘛,還想怎么排淀散?余下的部分是未排序好的列表谭期。
使用未排序的列表(seqNo)中的第一個元素 a ,對比已經排序好的列表(seqNo)中的每一個元素吧凉,從后往前對比隧出。如果 seqOk[i] > a,則對比排序好的列表seqOK中的下一個 seqOk[i-1]阀捅。直到seqOk[i] < a的時候 將a插入當前位置胀瞪。
依次seqNo中的每一個元素,最終獲得排序好的列表。

算法導論中的 排序算法 實現如下:
代碼如下:

    seq = [5, 4, 0, 3, 2, 1]
    print '排序前: ',seq
    for i in range(1,len(seq)):
        temp = seq[i]
        index = i-1
        while index >= 0 and seq[index] > temp:
            seq[index+1] = seq[index]
            index -= 1
        seq[index+1] = temp
        print '第 %s 次排序后' %i ,seq
    print '排序后:',seq```
運行結果如下:
![image.png](http://upload-images.jianshu.io/upload_images/4131789-67f98a9f34c79eb5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
還有一種實現方式如下:
seq = [5, 4, 0, 3, 2, 1]
print '排序前: ', seq
for i in range(1,len(seq)):
    temp = seq.pop(i)
    index = i-1
    while index > 0 and seq[index]>temp:
        index -= 1
    #這個地方需要判斷一次
    if index == 0 and temp > seq[index]:
        index += 1
    seq.insert(index,temp)
    print '第 %s 次排序后' % i, seq
print '排序后:', seq
運行結果如下:
![image.png](http://upload-images.jianshu.io/upload_images/4131789-1f2cdb0a6d275747.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
代碼中為什么需要判斷一次呢凄诞?
例如:[5, 4, 0, 3, 2, 1]
第一次循環(huán)的時候 i == 1 也就 temp == 4圆雁,index == 0,因為index == 0 所有while根本就沒有執(zhí)行帆谍,也就是說 seq[index]>temp根本就沒有比較就直接把元素插入index前面伪朽,也就是 把4 插入到 5的前面。
當列表排序為 [0,4,5,3,2,1]的時候:
此時 i == 3 也就是 temp == 3, index==2汛蝙。依次比較:seq[index]>temp
第一次:index == 2 烈涮,5>3 則 index -= 1。
第二次:index == 1窖剑, 4>3 則 index -= 1坚洽。
第三次:index == 0,但是 while index>0 不成立西土,所以 seq[index]>temp也就是0>3并沒有進行比較讶舰。
循環(huán)結束:此時index == 0 ,seq.insert(index,temp)將3插入下標index 0之前需了。
所以排序后的結果為: [3,0,4,5,2,1]
所以在插入之前要判斷一下是不是到達第一個元素了 也就是下標index == 0的時候 如果:temp > seq[index]跳昼,則插入index的后面,而不是前面肋乍。
也就是說 當index==0的時候鹅颊,此時 temp == 3,seq[index] == 0,這時候3要插入到0的后面住拭,插入前面就錯了挪略。
代碼如下:

seq = [5, 4,0,3, 2, 1]
print '排序前: ', seq
for i in range(1,len(seq)):
temp = seq.pop(i)
index = i-1
while index > 0 and seq[index]>temp:
index -= 1
seq.insert(index,temp)
print '第 %s 次排序后' % i, seq
print '排序后:', seq

運行結果如下:
![image.png](http://upload-images.jianshu.io/upload_images/4131789-ed13d3966a82105a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

我們對比一下 兩種排序方式:
第一種:每次對比都把符合條件的元素后移一位历帚。
    while index >= 0 and seq[index] > temp:
        seq[index+1] = seq[index]
        index -= 1
第二種:每次循環(huán)只需要彈出元素一次滔岳,插入元素一次。彈出挽牢,插入時數據結構的變化是python幫我們維護的谱煤,可能比我們手動來維護性能高一些吧。
    temp = seq.pop(i)
    index = i-1
    while index > 0 and seq[index]>temp:
        index -= 1
    if index == 0 and temp > seq[index]:
        index += 1
    seq.insert(index,temp)
我們來對比一下運行時間:

def haoshi(func):
def wapper():
start_time = time.time()
func()
print func.name,'耗時 ',time.time()-start_time
return wapper

@haoshi
def charu1():
"""第一種種排序插入方式"""
seq = range(10000)[::-1]
for i in range(1,len(seq)):
temp = seq[i]
index = i-1
while index >= 0 and seq[index] > temp:
seq[index+1] = seq[index]
index -= 1
seq[index+1] = temp

@haoshi
def charu2():
"""第二種排序插入方式"""
seq = range(10000)[::-1]
for i in range(1,len(seq)):
temp = seq.pop(i)
index = i-1
while index > 0 and seq[index]>temp:
index -= 1
if index == 0 and temp > seq[index]:
index += 1
seq.insert(index,temp)

charu1()
charu2()

運行結果如下:
![image.png](http://upload-images.jianshu.io/upload_images/4131789-668f005de848b0b7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)







最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末禽拔,一起剝皮案震驚了整個濱河市刘离,隨后出現的幾起案子,更是在濱河造成了極大的恐慌睹栖,老刑警劉巖硫惕,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異野来,居然都是意外死亡恼除,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豁辉,“玉大人令野,你說我怎么就攤上這事』占叮” “怎么了气破?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長餐抢。 經常有香客問我现使,道長,這世上最難降的妖魔是什么弹澎? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任朴下,我火速辦了婚禮,結果婚禮上苦蒿,老公的妹妹穿的比我還像新娘殴胧。我一直安慰自己,他們只是感情好佩迟,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布团滥。 她就那樣靜靜地躺著,像睡著了一般报强。 火紅的嫁衣襯著肌膚如雪灸姊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天秉溉,我揣著相機與錄音力惯,去河邊找鬼。 笑死召嘶,一個胖子當著我的面吹牛父晶,可吹牛的內容都是我干的。 我是一名探鬼主播弄跌,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼甲喝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铛只?” 一聲冷哼從身側響起埠胖,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淳玩,沒想到半個月后直撤,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蜕着,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年谋竖,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡圈盔,死狀恐怖豹芯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情驱敲,我是刑警寧澤铁蹈,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站众眨,受9級特大地震影響握牧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜娩梨,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一沿腰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狈定,春花似錦颂龙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芦缰,卻和暖如春企巢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背让蕾。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工浪规, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人探孝。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓笋婿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親再姑。 傳聞我的和親對象是個殘疾皇子萌抵,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容

  • 使用Python進行數據結構操作比較少見找御,但為了更深入的理解Python的操作原理元镀,提升自己的算法能力。我決定認真...
    mmmwhy閱讀 274評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理霎桅,服務發(fā)現栖疑,斷路器,智...
    卡卡羅2017閱讀 134,719評論 18 139
  • 某次二面時滔驶,面試官問起Js排序問題遇革,吾絞盡腦汁回答了幾種,深感算法有很大的問題,所以總計一下萝快! 排序算法說明 (1...
    流浪的先知閱讀 1,194評論 0 4
  • 本周的作業(yè)有一篇小作文锻霎,是細致刻畫人物。 我翻到的時候揪漩,樂了: 這是黑老師的嗎旋恼? 刻畫的真得很栩栩如生,畫面感十足...
    果果花閱讀 582評論 0 0
  • 樹靜靜地站著 穿著綠色的華服奄容, 她已經登上了 節(jié)日的舞臺冰更, 只等 風的音樂響起, 她就要開始舞動風采昂勒。
    晨光微曉閱讀 236評論 0 3