簡單理解插入排序


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

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

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

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

  我舉個例子:

  這是個雜亂的一組數字: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

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

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <title>js的插入排序</title>
    <meta name="keywords" content="關鍵字列表" />
    <meta name="description" content="網頁描述" />
    <link rel="stylesheet" type="text/css" href="" />
    <style type="text/css"></style>
    <script type="text/javascript">
    //插入排序,參數是數組
    function insertSort(arr){
        //判斷參數的合法性
        if(toString.call(arr) !== '[object Array]'){
            return false;
        }
        //獲取數組的長度
        var len = arr.length;
        if(len <= 1){
            return arr;//小於等於1不用排序
        }
        //i=1開始,留着0作為有序部分,也就是說,外層循環獲取數組后面的元素,也就是上面所講的無序部分
        for(var i=1;i<len;i++){
        //j=i-1,就是獲取有序部分最后的一個元素作為對照,也就是有序部分
            for(var j=i-1;j>=0;j--){//注意,j--,就是從有序部分的后面元素開始和無序部分的元素作比較
                if(arr[j] > arr[j+1]){//第一個j+1也就是外層循環i,
                    //互換元素,對前面數組進行排序
                    var temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    
return arr; } //測試 var ar = [9,3,8,5,2,7,0,6,1,4]; alert(insertSort(ar)); </script> </head> <body> </body> </html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM