插入排序基本思路:將數組分為兩個區(已排序區和未排序區),假定數組的第一個元素處於已排序區, 第一個元素之后的所有元素都處於未排序部分。排序時用到雙層循環,外層循環用於從未排序部分中取出待排序元素,並逐步縮小未排序部分,內層循環用於從已排序部分尋找插入位置(即不斷地從已排序部分尋找比待排序元素大的元素), 然后將較大的已排序區的元素后移,后移的最終結果是已排序區元素的最后一個元素占據待排序元素原來的位置,而已排序區中間空出一個位置),最后將待排序元素插入元素后移之后留下的空位。
1 //插入排序 2 function insert_sort($arr) { 3 //獲取數組單元個數 4 $count = count($arr); 5 //外層循環用於從未排序區域中取出待排序元素 6 for ($i=1; $i < $count; $i++) { 7 //獲取當前需要插入已排序區域的元素值 8 $temp = $arr[$i]; 9 //內層循環用於從已排序區域尋找待排序元素的插入位置 10 for ($j=$i-1; $j >= 0; $j--) { 11 //如果$arr[$i]比已排序區域的$arr[$j]小,就后移$arr[$j] 12 if ($temp < $arr[$j]) { 13 $arr[$j+1] = $arr[$j]; 14 $arr[$j] = $temp; 15 } else { 16 //如果$arr[$i]不小於$arr[$j],則對已排序區無需再排序 17 break; 18 } 19 } 20 } 21 return $arr; 22 } 23 24 $arr = array(6, 19, 26, 62, 88, 99, 18, 16, 1); 25 var_dump(insert_sort($arr));
測試結果:
