希尔排序

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

认识与理解:

  1. 又称为“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。是非稳定排序算法;
  2. 将数列按照约定的增量进行分组,然后对每一组进行直接插入排序;减小增量,重复操作;
  3. 增量的取值,初次约为序列的一半,以后每次减半,直到增量等于1。此时相当于标准的插入排序;

算法步骤:

代码实现(PHP):

<?php
	function shellSort(array &$arr,array $gaps){
		for ($gap=0; $gap < count($gaps); $gap++) { 
			echo "增量为:".$gaps[$gap]."</br>";
			for ($i=$gaps[$gap]; $i < count($arr); $i++) { 
				echo "当 i=".$i."</br>";
				$temp = $arr[$i];
				for ($j=$i; $j >= $gaps[$gap] && $arr[$j-$gaps[$gap]] > $temp; $j -= $gaps[$gap]) { 
					$arr[$j] = $arr[$j-$gaps[$gap]];
					foreach ($arr as $value) {
						echo $value." ";
					}
					echo "</br>";
				}
				$arr[$j] = $temp;
				echo "当 i=".$i." 时,排序结果:"."</br>";
				foreach ($arr as $value) {
					echo $value." ";
				}
				echo "</br></br>";
			}
		}
	}
	
	$gaps = array(5,2,1);
	$arr = array();
	for ($i=0; $i < 10; $i++) { 
		array_push($arr,mt_rand(1,40));
	}
	echo "原始序列:";
	foreach ($arr as $value) {
		echo $value." ";
	}
	echo "</br></br>";
	shellSort($arr,$gaps);
?>

运行结果:

原始序列
Array ( [0] => 22 [1] => 12 [2] => 23 [3] => 8 [4] => 16 [5] => 30 [6] => 9 [7] => 12 [8] => 34 [9] => 7 )

增量为:5
当 i=5
排序结果:
Array ( [0] => 22 [1] => 12 [2] => 23 [3] => 8 [4] => 16 [5] => 30 [6] => 9 [7] => 12 [8] => 34 [9] => 7 )

当 i=6
Array ( [0] => 22 [1] => 12 [2] => 23 [3] => 8 [4] => 16 [5] => 30 [6] => 12 [7] => 12 [8] => 34 [9] => 7 )
排序结果:
Array ( [0] => 22 [1] => 9 [2] => 23 [3] => 8 [4] => 16 [5] => 30 [6] => 12 [7] => 12 [8] => 34 [9] => 7 )

当 i=7
Array ( [0] => 22 [1] => 9 [2] => 23 [3] => 8 [4] => 16 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 7 )
排序结果:
Array ( [0] => 22 [1] => 9 [2] => 12 [3] => 8 [4] => 16 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 7 )

当 i=8
排序结果:
Array ( [0] => 22 [1] => 9 [2] => 12 [3] => 8 [4] => 16 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 7 )

当 i=9
Array ( [0] => 22 [1] => 9 [2] => 12 [3] => 8 [4] => 16 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )
排序结果:
Array ( [0] => 22 [1] => 9 [2] => 12 [3] => 8 [4] => 7 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )

增量为:2
当 i=2
Array ( [0] => 22 [1] => 9 [2] => 22 [3] => 8 [4] => 7 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )
排序结果:
Array ( [0] => 12 [1] => 9 [2] => 22 [3] => 8 [4] => 7 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )

当 i=3
Array ( [0] => 12 [1] => 9 [2] => 22 [3] => 9 [4] => 7 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )
排序结果:
Array ( [0] => 12 [1] => 8 [2] => 22 [3] => 9 [4] => 7 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )

当 i=4
Array ( [0] => 12 [1] => 8 [2] => 22 [3] => 9 [4] => 22 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )
Array ( [0] => 12 [1] => 8 [2] => 12 [3] => 9 [4] => 22 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 22 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )

当 i=5
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 22 [5] => 30 [6] => 12 [7] => 23 [8] => 34 [9] => 16 )

当 i=6
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 22 [5] => 30 [6] => 22 [7] => 23 [8] => 34 [9] => 16 )
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 30 [6] => 22 [7] => 23 [8] => 34 [9] => 16 )

当 i=7
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 30 [6] => 22 [7] => 30 [8] => 34 [9] => 16 )
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 23 [6] => 22 [7] => 30 [8] => 34 [9] => 16 )

当 i=8
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 23 [6] => 22 [7] => 30 [8] => 34 [9] => 16 )

当 i=9
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 23 [6] => 22 [7] => 30 [8] => 34 [9] => 30 )
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 23 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

增量为:1
当 i=1
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=2
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 9 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=3
Array ( [0] => 7 [1] => 8 [2] => 12 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=4
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=5
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=6
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=7
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=8
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 30 )

当 i=9
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 34 [9] => 34 )
排序结果:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 12 [4] => 12 [5] => 16 [6] => 22 [7] => 23 [8] => 30 [9] => 34 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值