插入排序

声明:本文是在参考资料后所做的总结,对其中的部分优质内容会有“复制粘贴”操作。由于水平有限,不足之处在所难免,欢迎大家留言指正

算法描述:

  1. 假设将数列分为{a0,a1,…,ai-1}有序数列和{ai,ai+1,…,an-1}无序数列两部分,其中 i >=1;
  2. 从无序数列中取出一个元素 ai,与有序数列中的元素 aj (0 ≤ j ≤ i-1)从后向前比较;
  3. 如果 ai < aj,记录下标 k = j,并且 aj+1=aj,j = j-1;当 j=0 或 ai > aj 时,ak=ai 。结束本次插入比较;
  4. 如果 ai ≥ aj,结束本次插入比较,i = i+1;
  5. 重复步骤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 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值