- 描述: 插入排序的基本思想就是 對於給定的一組記錄,初始時假設第一個記錄自成一個有序序列,其餘的記錄爲無序序列。
- 接着從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最後一個記錄插入到有序序列中爲止。
-
- 比如:
- 數組 array(2,5,1,3)
- 第一步插入 2 以後: [2] 5 1 3
- 第二步插入 5 以後: [2 5] 1 3
- 第三步插入 1 以後: [1 2 5] 3
- …]
header("Content-type:text/html;charset=utf-8");
function insertSort($arr){
//已經間接將數組分成2部分,下標小於當前的(左邊的)是排序好的序列
$len = count($arr);
for($i = 1; $i < $len; $i ){
//獲取當前需要比較的元素值
$tmp = $arr[$i];
//內層循環,控制比較並插入
for($j=$i -1;$j>=0;$j--){
if($tmp < $arr[$j]){
$arr[$j 1] = $arr[$j];
$arr[$j] = $tmp;
}else{
break;
}
}
}
return $arr;
}
// 可以對傳統的插入排序算法進行改進,在查找插入位置時使用二分查找的方式。
function insertSort2($arr) {
for ($i = 1; $i < count($arr); $i ) {
$key = $arr[$i];
$left = 0;
$right = $i - 1;
while ($left <= $right) {
// ceil() - 進一法取整
// round() - 對浮點數進行四捨五入
// floor() -返回不大於 value 的最接近的整數
$middle = floor(($left $right) / 2);
if ($key < $arr[$middle]) {
$right = $middle - 1;
} else {
$left = $middle 1;
}
}
for ($j=$i-1; $j>= $left; $j--) {
$arr[$j 1] = $arr[$j];
}
$arr[$left] = $key;
}
return $arr;
}
$arr = array(34, 55, 23, 34, 67);
echo "排序前: ";
foreach ($arr as $k => $val)
{
echo $val.' ';
}
echo "<br>排序後 : ";
$arr = insertSort($arr);
foreach ($arr as $k => $val)
{
echo $val.' ';
}