1. 程式人生 > >Python---插入排序---目前看過最清晰的解析---轉載

Python---插入排序---目前看過最清晰的解析---轉載

如何理解插入排序,為什麼使用插入排序

在這裡,我詳細的講一下我個人對於插入排序的理解。

  每個人對於事物的理解都是不一樣的,因為每個人對世界萬物的看法和思考方式都不一樣。因此,對於排序演算法,我想每個人都有自己的理解方式,所以,雖然部落格園裡有很多關於排序的文章,但那只是其他人對這幾個排序的理解方式,而筆者也有自己的理解方式,所以,筆者也就沒有在意部落格園寫了那麼多關於排序的文章而還在這裡寫下個人的見解了。

  對於插入排序,筆者是這麼理解的:

  插入排序就是把一組數字分成兩部分,一部分是排好順序的,另一部分是沒有排好順序的,然後,就是從沒有排好順序的那組數字中獲取數字,把它插入到已經排好的順序的那部分數字中,當然,在插入到已經排好順序的那部分數字時,你還必須讓這個插入進來的數字與已經排好順序的數字進行比較,為的是保證已經排好的順序的那部分數字不被打亂,插入排序的關鍵也就是這裡,如果能夠理解這裡,我想對於接下來我寫的程式碼應該不難理解了。

  我舉個例子:

  這是個雜亂的一組數字:8,1,2,5,9,3,4,6,7,0

  看到上面的那組數字嗎?你覺得能把這組數字分出一部分有序的出來嗎?因為,我們插入排序首先要做的就是在一組數字中找出有序的部分,所以,首先,你得從一組數字中找到有序的才行對吧?其實,上面那組數字是可以找到有序的部分的。怎麼說呢?很簡單,你把第一個數字8當成一部分,其餘的當成另外一部分,不就分出一部分有序的數字和一部分無序的數字了嗎?你想想,第一部分就是一個數字8,一個數字構成的一部分,它都不用比較了,這還不是有序的那還得了,呵呵。

  之所以在這裡提一下一個數字當成一部分的情況,那是因為,我們所提供的插入排序的數字是雜亂的,無序的,我們誰也不能保證最開始的那部分一定是有序的,因此,我們就只能選擇一個數字作為有序的那部分才能保證所有的排序都是在有序那部分進行的,不然,插入排序就沒辦法找到有序的那部分了。

  插入排序開始:

  第一個有序部分(就是第一個數字了):8

  第一個無序部分(就是剩下的部分了):1,2,5,9,3,4,6,7,0

  根據前面所講的插入排序原理:從無序部分中獲取數字,把它插入到有序的那一部分中。

  1、這裡怎麼在無序部分中獲取數字?

  2、怎麼把獲取的數字有序的插入到有序部分中?換句話說,就是怎麼讓這個獲取的數字插入到有序的那部分之後,有序的那部分還是有序的,並不會被這個插入的數字破壞掉隊形而變得無序?

  首先回答第一個問題:

  這個問題其實很簡單啦,我們把那組無序的陣列分成兩部分之後,只要從無序的那部分數字的第一個數字開始往後面獲取數字就行了,是吧?

  接下來回答第二個問題:

  這個問題有點複雜,我就不敘述了,直接舉例子吧,這樣子更容易理解。

  第二次插入排序:

  首先我們從上面已經分好的無序部分:1,2,5,9,3,4,6,7,0(前面已經把8分成有序的部分了)獲取第一個數字1,假設我們是從小排到大的排序這組數字,獲取1這個數字之後,我們就要把1插入到8中啦,對吧?

  我們把1和8做比較,比較規則:大於,8>1?真,既然是真,那麼它們就要調換位置了,對吧?

  所以經過一次排序之後,原來的那組有序數字和無序數字就變成了下面的了:

  第二個有序部分:1,8

  第二個無序部分:2,5,9,3,4,6,7,0

  經過兩輪的有序和無序分組之後,就得到上面的兩個有序數字和無序數字了,接下來,我們繼續插入排序

  依然從後面的無序部分獲取數字2,獲取之後,從有序部分的後面數字開始逐一的和2做比較,8>2嗎?真,那麼它們兩者就調換位置。接下來讓1和2作比較,1>2嗎?假,那麼就跳過不管,所以,就得到下面的有序和無序部分了。

  第三個有序部分:1,2,8

  第三個無序部分:5,9,3,4,6,7,0

  比較到這裡,插入排序已經初步形成有序數字了,接下來的比較我就不敘述了,你們自己想想吧。接下來是程式碼,程式碼的思維和這裡的描述是一樣的,你可以自己除錯看一下程式碼的執行過程就再明白不過了。

  注意、每一輪比較過後,有序部分總會多一個元素,而無序部分則少一個元素,插入排序嘛,就是從無序部分擷取數字插入到有序部分中啦,這和下面的程式碼迴圈是一致的。