python插入排序演算法總結

來源:互聯網
上載者:User

標籤:span   else   程式   元素   就是   第一步   執行   交換   python   

插入排序演算法總結:

插入演算法的核心是 每次迴圈到一個數時,都認為這個數之前的數列都是排好序的,將一個數插入到已經排好序的有序數列中,從而得到一個新的、個數加一的有序數列。

過程:從第一個元素開始,第一個數肯定是有序的,把第二個數和第一個數相比,插入到合適的位置,這樣前兩個數就是有序的了,接著,把第三個元素插入到前麵包含兩個元素的有序列表中,依次類推,知道插完第n個資料。

 

第一步:拿一個有序數列為基礎,後邊加一個數,實現插入排序的邏輯

a=[3,5,8,10,6]

 

代碼

#encodjng=utf-8

 

a=[3,5,8,10,6]

print a

index=len(a)-1

for j in range(index-1,-1,-1):

    print "j:",j

    if a[j+1] < a[j]:

        a[j+1],a[j]=a[j],a[j+1]

        print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])

        print " a:",a

    else:

        break

 

print a

       

執行過程:

 

D:\test>python test.py

[3, 5, 8, 10, 6]

j: 3

a[j+1] < a[j]: 10 < 6

 a: [3, 5, 8, 6, 10]

j: 2

a[j+1] < a[j]: 8 < 6

 a: [3, 5, 6, 8, 10]

j: 1

[3, 5, 6, 8, 10]

可以看到,預設列表前4個數3,5,8,10是從小到大排好序的,然後j從10的座標3向前遍曆到3的座標1;

當j為3時,用j座標後邊的值(6)和j座標的值做對比,如果6小(j[j+1] < a[j]),把6和j座標的值交換;

當j為2時,用j座標後邊的值(還是6,因為6已經換到這兒了),如果6小(j[j+1] < a[j]),把6和j座標的值交換;

以此類推,就間接的實現了程式的邏輯:用新的數從後往前依次和前面的排好序的數列對比,小於的話就放到前邊,類似冒泡排序的反過程,之所以說是間接,是因為對比的過程並不是用新的數6和依次和前邊的數做對比,而是用a[j+1]和a[j]這種取座標的方式作對比,只不過這種下標的方式取得結果看上去是用6和前面的數依次做對比。所以,同一種演算法思路可能會有多種實現方式,這裡,也可以用臨時變數的形式實現直觀的用6和前邊的數作對比,以後嘗試實現。

 

第二步:將列表的所有元素按照步驟一的邏輯實現代碼:

#encodjng=utf-8

 

a=[9,2,5,1,0,4]

print a

index=len(a)-1

for i in range(index):

    print "i:",i

    for j in range(i,-1,-1):

        print "j:",j

        if a[j+1] < a[j]:

            a[j+1],a[j]=a[j],a[j+1]

            print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])

            print " a:",a

        else:

            break

 

    print a

       

執行過程:

D:\test>python test.py

[9, 2, 5, 1, 0, 4]

i: 0

  j: 0

  a[j+1] < a[j]: 9 < 2

  a: [2, 9, 5, 1, 0, 4]

[2, 9, 5, 1, 0, 4]

i: 1

  j: 1

  a[j+1] < a[j]: 9 < 5

  a: [2, 5, 9, 1, 0, 4]

  j: 0

[2, 5, 9, 1, 0, 4]

i: 2

  j: 2

  a[j+1] < a[j]: 9 < 1

  a: [2, 5, 1, 9, 0, 4]

  j: 1

  a[j+1] < a[j]: 5 < 1

  a: [2, 1, 5, 9, 0, 4]

  j: 0

  a[j+1] < a[j]: 2 < 1

  a: [1, 2, 5, 9, 0, 4]

[1, 2, 5, 9, 0, 4]

i: 3

  j: 3

  a[j+1] < a[j]: 9 < 0

  a: [1, 2, 5, 0, 9, 4]

  j: 2

  a[j+1] < a[j]: 5 < 0

  a: [1, 2, 0, 5, 9, 4]

  j: 1

  a[j+1] < a[j]: 2 < 0

  a: [1, 0, 2, 5, 9, 4]

  j: 0

  a[j+1] < a[j]: 1 < 0

  a: [0, 1, 2, 5, 9, 4]

[0, 1, 2, 5, 9, 4]

i: 4

  j: 4

  a[j+1] < a[j]: 9 < 4

  a: [0, 1, 2, 5, 4, 9]

  j: 3

  a[j+1] < a[j]: 5 < 4

  a: [0, 1, 2, 4, 5, 9]

  j: 2

[0, 1, 2, 4, 5, 9]可以看到,核心還是第一步實現的邏輯(第二層迴圈);

當i從第一個數的座標(0)便利到最後第二個數的座標(len(a) -1 -1),j就從座標i往回遍曆到座標0;

然後用j+1座標的值和前邊的j座標的值作對比,如果小於,就挪到前邊,不小於就跳出;

這樣插入的邏輯就從第一個數執行到最後一個數,整個排序演算法就執行完了

python插入排序演算法總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.