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);
?>