python-036-插入排序

友好簡單的排序算法——插入排序钓丰。直接看程序或者看定義之類直接講解的文字,我覺得還是不太好理解。
其實插入排序更適合一部分已經(jīng)有序的序列靴姿,比如1,2,3,4,5,6,9,8,7。

我們應(yīng)該都摸過撲克牌吧磁滚,或者搓過麻將吧佛吓。我說的是實體的牌,不是換了斗地主還有麻將垂攘。
我們來回憶一下维雇,當我們拿到一張新牌,我們在干什么晒他?當我們拿到一堆沒有序的牌我們在干什么吱型?

我們在給牌排序,無論是從A陨仅,2唁影,3耕陷,……,K据沈,還是從2哟沫,A,K锌介,Q嗜诀,……3。我們總是從一張牌開始孔祸,然后拿到一張新的隆敢,放到它應(yīng)該在的位置,直到我們?nèi)颗藕梦覀兊呐啤?/p>

打麻將時崔慧,摸到一張新的牌拂蝎,但是又不需要打出去時,我們也會把它放到它應(yīng)該在的位置惶室,我們在開始打麻將時就會把牌排好温自,直接插就行。

如果你沒打過麻將皇钞,沒有打過撲克悼泌,……,我也不知道怎么辦了夹界。

插入排序的原理和我們打撲克搓麻將是一樣的馆里。上面的兩個例子,剛好就說明了我們的過程可柿。兩種鸠踪,一是給一堆沒有順序的序列排序,二是給一個新的元素插入到一個有序的序列中复斥。

我們把第一個元素看作一個有序的序列营密,后面的看作無序的待插入的序列。從第二個數(shù)開始永票,將其與其前一個數(shù)比較,如果不符合我們要求的排序順序(升序或者降序滥沫,或者我們自己定義的規(guī)則)侣集,則互換位置,然后再與前一個數(shù)作比較直到滿足我們的排序順序兰绣。然后再將下一個數(shù)進行排序世分,直到全部完成。
例如 5, 3, 2, 6 的排序過程:

  • 5, 3, 2, 6
  • 3, 5, 2, 6
  • 3, 5, 2, 6
  • 3, 2, 5, 6
  • 2, 3, 5, 6
  • 2, 3, 5, 6
  • 2, 3, 5, 6

這樣就很好理解缀辩,但是還不夠好臭埋。后面再來優(yōu)化踪央,我們先來實現(xiàn)這個insertion_sort():

def insertion_sort(a):
    for i in range(1,len(a)):   # 插入排序從第二個位置開始
        for j in range(i, 0, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]


a = [9, 7, 5, 6, 3, 2, 1, 4, 8]
insertion_sort(a)
print(a)

輸出結(jié)果為:

image.png

這樣一個簡單的插入排序算法就實現(xiàn)出來了。

前面說的可以優(yōu)化是這樣瓢阴,每一次排序時畅蹂,我們都需要將當前值與其前面的數(shù)互換位置m次,m是比較后不滿足要求的次數(shù)荣恐。所以如果第k個數(shù)需要排在第一位液斜,那么他就需要互換位置k-1次〉拢互換位置在python中直接用一個語句就可以完成少漆,但是在其他的語言中就需要用一個臨時值來做過渡,才能夠完成硼被,所以我們應(yīng)該減少互換位置的次數(shù)示损。

我在前面的撲克牌的舉例中,已經(jīng)加粗了相關(guān)的部分嚷硫,就是應(yīng)該在的位置检访。我們先存儲當前排序的數(shù),然后找到它應(yīng)該在的位置论巍,然后將這個位置空出來烛谊,并把記錄的值放到這個位置。也就是把這個位置之后的元素嘉汰,都后移一個位置丹禀,然后插入,這真的是非常形象了鞋怀。

下面我們來實現(xiàn)這個排序算法:

def new_insertion_sort(a):
    for i in range(1, len(a)):  # 插入排序從第二個位置開始
        cur = a[i]  # 保存當前的值
        j = i   # 用于尋找cur應(yīng)該在的位置
        while j > 0:
            if a[j-1] > cur:
                a[j] = a[j-1]
                j -= 1
            else:
                break
        a[j] = cur

當然我們還可以改進:

def new_insertion_sort(a):
    for i in range(1, len(a)):  # 插入排序從第二個位置開始
        cur = a[i]  # 保存當前的值
        j = i   # 用于尋找cur應(yīng)該在的位置
        while j > 0 and a[j-1] > cur:
            a[j] = a[j-1]
            j -= 1
        a[j] = cur

最后的結(jié)果是一樣的:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双泪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子密似,更是在濱河造成了極大的恐慌焙矛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件残腌,死亡現(xiàn)場離奇詭異村斟,居然都是意外死亡,警方通過查閱死者的電腦和手機抛猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門蟆盹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闺金,你說我怎么就攤上這事逾滥。” “怎么了败匹?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵寨昙,是天一觀的道長讥巡。 經(jīng)常有香客問我,道長舔哪,這世上最難降的妖魔是什么欢顷? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮尸红,結(jié)果婚禮上吱涉,老公的妹妹穿的比我還像新娘。我一直安慰自己外里,他們只是感情好怎爵,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盅蝗,像睡著了一般鳖链。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墩莫,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天芙委,我揣著相機與錄音,去河邊找鬼狂秦。 笑死灌侣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的裂问。 我是一名探鬼主播侧啼,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堪簿!你這毒婦竟也來了痊乾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤椭更,失蹤者是張志新(化名)和其女友劉穎哪审,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虑瀑,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡湿滓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舌狗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叽奥。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖把夸,靈堂內(nèi)的尸體忽然破棺而出而线,到底是詐尸還是另有隱情铭污,我是刑警寧澤恋日,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布膀篮,位于F島的核電站,受9級特大地震影響岂膳,放射性物質(zhì)發(fā)生泄漏誓竿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一谈截、第九天 我趴在偏房一處隱蔽的房頂上張望筷屡。 院中可真熱鬧,春花似錦簸喂、人聲如沸毙死。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扼倘。三九已至,卻和暖如春除呵,著一層夾襖步出監(jiān)牢的瞬間再菊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工颜曾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纠拔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓泛豪,卻偏偏與公主長得像稠诲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子候址,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序吕粹,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大岗仑,一次不能容納全部...
    蟻前閱讀 5,164評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序匹耕,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大荠雕,一次不能容納全部...
    printf200閱讀 760評論 0 0
  • 概述 排序有內(nèi)部排序和外部排序稳其,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大炸卑,一次不能容納全部...
    閑云清煙閱讀 756評論 0 6
  • 一. 寫在前面 要學習算法既鞠,“排序”是一個回避不了的重要話題,在分析完并查集算法和常用數(shù)據(jù)結(jié)構(gòu)之后盖文,今天我們終于可...
    Leesper閱讀 2,520評論 0 40