初始状态: (17) ,3 ,25 ,14 ,20, 9
第一次插入:(3 , 17),25 ,14 ,20, 9
第二次插入:(3 , 17, 25),14 ,20, 9
第三次插入:(3 , 14, 17, 25),20, 9
第四次插入:(3 , 14, 17, 20 ,25),9
第五次插入:(3 , 9 ,14, 17, 20 ,25)
<?php/*** php 插入排序*/
$arr = array(17,3 ,25,14,20,9);function insertSort(&$arr) {//先默认第一个下标为0的数是排好的数for ($i = 1; $i < count($arr); $i++) {//确定插入比较的数$insertVal = $arr[$i];//确定与前面比较的数比较$insertIndex = $i - 1;//表示没有找到位置while ($insertIndex >= 0 && $insertVal < $arr[$insertIndex]) {//把数后移$arr[$insertIndex + 1] = $arr[$insertIndex];$insertIndex--;}//插入(给$insertval找到位置了)$arr[$insertIndex + 1] = $insertVal;}
}insertSort($arr);
print_r($arr);
?>
2、后插:
插入流程:
初始状态: 17,3 ,25,14,20,(9)
第一次插入:3 ,17,25,14,(9,20)
第二次插入:3 ,17,25,(9,14,20)
第三次插入:3 ,14,(9,17,20,25)
第四次插入:3 ,(9,14,17,20,25)
第五次插入:(3 ,9,14,17,20,25)
代码实现:
<?php/*** php 插入排序 */
$arr = array(17,3 ,25,14,20,9);function insertSort(&$arr) {$len = count($arr);//先默认第一个下标为len的数是排好的数 for ($i = $len - 2; $i >= 0; $i--) {//确定插入比较的数 $insertVal = $arr[$i];//确定与前面比较的数比较 $insertIndex = $i + 1;//表示没有找到位置 while ($insertIndex < $len && $insertVal > $arr[$insertIndex]) {//把数前移 $arr[$insertIndex - 1] = $arr[$insertIndex];$insertIndex++;}//插入(给$insertval找到位置了) $arr[$insertIndex - 1] = $insertVal;}
}insertSort($arr);
print_r($arr);
?>
二、二分插入排序:二分插入排序只不过查找的方式不同而已。每次要插入的值$a[$i]总是与前面已排好序的中间的值$a[$mid]进行比较,如果$a[$i]比较小则在前面的区间继续二分查找,否则在后面的区间。
<?php/*** php 插入排序 */
$arr = array(12, 234, 33);function binarySort(&$a) {$len = count($a);for ($i = 1; $i < $len; $i++) {$left = 0;$right = $i;while ($left <= $right) {$mid = intval(($left + $right) / 2);if ($a[$mid] > $a[$i]) {$right = $mid - 1;} else if ($a[$mid] < $a[$i]) {$left = $mid + 1;} else {break;}}//保存当前数据$s = $a[$i];//将数据向后移动for ($k = $i; $k >= $left; $k--) {$a[$k] = $a[$k - 1];}//将当前的数据放在找到的位置$a[$left] = $s;}
}binarySort($arr);
print_r($arr);
?>