1. 程式人生 > >php排序演算法之插入排序

php排序演算法之插入排序

目錄

一: 原理

二: 舉例說明

三: 插入排序步驟

四: PHP程式碼實現插入排序


一: 原理

       插入排序(Insertion Sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。

二: 舉例說明

原始陣列:     10   9   5   12  1           預設10已經被排序,稱為有序區,9,5,12,1未排序,成為無序區

第一次排序:  9   10  5   12  1           取出無序區第一個元素10,在有序區元素序列中從後往前面掃描,如果該元素(已排序的10)大於                                                          新元素9,則10移動下一個位置,新元素9佔據10的位置

第二次排序:  5   9  10  12  1            取出5跟10比較,10往後移一個位置;再用5跟9比較,9後移一個位置,5佔據元素9的位置

第三次排序:  5   9  10  12  1

第四次排序:  1   5   9   10  12 

三: 插入排序步驟

1. 從第一個元素開始,該元素可以認為已經被排序,比如上面例子中10;

2. 取出下一個元素,在已經排序的元素序列中從後向前掃描;

3. 如果該元素(已排序)大於新元素,將該元素移到下一位置;

4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;

5. 將新元素插入到該位置中;

6. 重複步驟2;

eg:  比如上例子:  第二次排序時,取出5,在已經排序區9,10中從後向前掃描,第一次比較5和10,10比5大,10移動到下一個位置,然後再把5同9比較,9比5大,9在往後移動一個位置;此時5已經在已排序區第一個位置了,就把5放在這個這個位置,然後迴圈操作排序;

四: PHP程式碼實現插入排序

1.將陣列分成兩個區域:已排序區域和未排序區域。首先假設陣列的第一個元素處於已排序區域,第一個元素之後的所有元素都處於未排序區域。

2. 排序時用到兩層迴圈,第一層迴圈用於從未排序區域中取出待排序元素,並逐步縮小未排序區域,第二層迴圈用於從已排序區域中尋找插入位置(即不斷地從已排序區域中尋找比待排序元素大的元素,然後將較大的已排序區的元素後移,後移的最終結果是已排序區元素的最後一個元素佔據, 待排序元素原來的位置,而已排序區中間空出一個位置),最後將待排序元素插入元素後移後留下的空位;

3.實現:

<?php
//插入排序
function insertSort(&$arr)
{
    $count = count($arr); //計算排序元素個數
    /**
     * 第一層迴圈用於從未排序區域中取出待排序元素,並逐步縮小未排序區域,
     * 第二層迴圈用於從已排序區域中尋找插入位置      * 
     */
    for ($i = 1; $i < $count; $i++)
    {
        //獲得當前需要比較的元素值
        $temp = $arr[$i];
        //內層迴圈控制 比較 並 插入
        for ($j = $i-1; $j >= 0; $j--)  
        {
            /**
             * $temp需要插入的元素;
             * $arr[$j]需要比較的元素
             */
            if($arr[$j] > $temp)
            {
                /**
                 * 發現插入的元素要小,交換位置
                 * 將後邊的元素與前面的元素互換
                 */
                $arr[$j+1] = $arr[$j];
                //將前面的數設定為當前需要交換的數
                $arr[$j] = $temp;
            }
            else
            {
                /**
                 * 如果碰到不需要移動的元素
                 * 由於是已經排序好是陣列,則前面的就不需要再次比較了。
                 */
                break;
            }
        }
    } 
    //將這個元素 插入到已經排序好的序列內,返回
    return $arr;
}

//呼叫插入排序實現元素排序
$arr = array(1,100,121,99,12);
insertSort($arr);
print_r($arr); 

?>