声明:本文是在参考资料后所做的总结,对其中的部分优质内容会有“复制粘贴”操作。由于水平有限,不足之处在所难免,欢迎大家留言指正
算法描述:
- 假设将数列分为{a0,a1,…,ai-1}有序数列和{ai,ai+1,…,an-1}无序数列两部分,其中 i >=1;
- 从无序数列中取出一个元素 ai,与有序数列中的元素 aj (0 ≤ j ≤ i-1)从后向前比较;
- 如果 ai < aj,记录下标 k = j,并且 aj+1=aj,j = j-1;当 j=0 或 ai > aj 时,ak=ai 。结束本次插入比较;
- 如果 ai ≥ aj,结束本次插入比较,i = i+1;
- 重复步骤2~4,当 i > n-1 时,结束程序。
代码实现:
<?php
function insertSort(&$arr){
for($i=1;$i<count($arr);$i++){
$tmp=$arr[$i];
$key=$i-1;
echo "第".$i."次插入过程:";
while($key>=0&&$tmp<$arr[$key]){
$arr[$key+1]=$arr[$key];
$key--;
echo "</br>";
print_r($arr);
}
if(($key+1)!=$i){
$arr[$key+1]=$tmp;
echo "</br>"."结果:"."</br>";
print_r($arr);
echo "</br>";
}else{
echo "没有换值操作"."</br>";
}
echo "</br>";
}
return $arr;
}
$arr = array();
for ($i=0; $i < 10; $i++) {
array_push($arr,mt_rand(0,20));
}
echo "原始序列:"."</br>";
print_r($arr);
echo "</br></br>";
insertSort($arr);
echo "最终排序:"."</br>";
print_r($arr);
?>
运行结果:
原始序列:
Array ( [0] => 7 [1] => 2 [2] => 8 [3] => 17 [4] => 4 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
第1次插入过程:
Array ( [0] => 7 [1] => 7 [2] => 8 [3] => 17 [4] => 4 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
结果:
Array ([0] => 2 [1] => 7 [2] => 8 [3] => 17 [4] => 4 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
第2次插入过程:没有换值操作
第3次插入过程:没有换值操作
第4次插入过程:
Array ( [0] => 2 [1] => 7 [2] => 8 [3] => 17 [4] => 17 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 7 [2] => 8 [3] => 8 [4] => 17 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 7 [2] => 7 [3] => 8 [4] => 17 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
结果:
Array ( [0] => 2 [1] => 4 [2] => 7 [3] => 8 [4] => 17 [5] => 3 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
第5次插入过程:
Array ( [0] => 2 [1] => 4 [2] => 7 [3] => 8 [4] => 17 [5] => 17 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 4 [2] => 7 [3] => 8 [4] => 8 [5] => 17 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 4 [2] => 7 [3] => 7 [4] => 8 [5] => 17 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 4 [2] => 4 [3] => 7 [4] => 8 [5] => 17 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
结果:
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 8 [5] => 17 [6] => 8 [7] => 0 [8] => 20 [9] => 9 )
第6次插入过程:
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 8 [5] => 17 [6] => 17 [7] => 0 [8] => 20 [9] => 9 )
结果:
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 8 [5] => 8 [6] => 17 [7] => 0 [8] => 20 [9] => 9 )
第7次插入过程:
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 8 [5] => 8 [6] => 17 [7] => 17 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 8 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 8 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 7 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 3 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
Array ( [0] => 2 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
结果:
Array ( [0] => 0 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 9 )
第8次插入过程:没有换值操作
第9次插入过程:
Array ( [0] => 0 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 20 [9] => 20 )
Array ( [0] => 0 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 17 [8] => 17 [9] => 20 )
结果:
Array ( [0] => 0 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 9 [8] => 17 [9] => 20 )
最终排序:
Array ( [0] => 0 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 8 [6] => 8 [7] => 9 [8] => 17 [9] => 20 )