声明:本文是在参考资料后所做的总结,对其中的部分优质内容会有“复制粘贴”操作。由于水平有限,不足之处在所难免,欢迎大家留言指正
认识与理解:
- 又称为“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。是非稳定排序算法;
- 将数列按照约定的增量进行分组,然后对每一组进行直接插入排序;减小增量,重复操作;
- 增量的取值,初次约为序列的一半,以后每次减半,直到增量等于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 )