希尔排序原理:
希尔排序是把一个数组划分为多个相隔h单位的h数组,对每一个这样的数组应用插入排序
希尔排序是基于插入排序的一种改进算法
实现如下:
<?php
function exch(&$a, $i, $j) {
$tmp = $a[$i];
$a[$i] = $a[$j];
$a[$j] = $tmp;
}
function less($m, $n) {
return $m < $n;
}
function shell_sort(&$arr) {
$len = count($arr);
$h = 1;
while($h < $len/3) $h = $h*3+1;
while($h >= 1) {
for($i = $h; $i < $len; $i++) {
for($j = $i; $j >= $h && less($arr[$j], $arr[$j-$h]); $j -= $h) {
exch($arr, $j, $j - $h);
}
}
$h = intval($h/3);
}
}
$a = array(7, 2, 5, 3, 8, 4, 9, 1, 6);
echo "7-2-5-3-8-4-9-1-6<br/>";
shell_sort($a);
print_r($a);
自己动手画出排序过程更有利于对排序算法的理解
array(7, 2, 5, 3, 8, 4, 9, 1, 6);//原始数组
array(7, 2, 5, 3, 8, 4, 9, 1, 6);//升序,不用操作
array(7, 2, 5, 3, 8, 4, 9, 1, 6);//升序,不用操作
array(7, 2, 5, 3, 8, 4, 9, 1, 6);//升序,不用操作
array(7, 2, 5, 1, 8, 4, 9, 3, 6);//降序,插入1
array(6, 2, 5, 1, 7, 4, 9, 3, 8);//降序,插入6
array(2, 6, 5, 1, 7, 4, 9, 3, 8);//降序,插入2
array(2, 5, 6, 1, 7, 4, 9, 3, 8);//降序,插入5
array(1, 2, 5, 6, 7, 4, 9, 3, 8);//降序,插入1
array(1, 2, 5, 6, 7, 4, 9, 3, 8);//升序,不用操作
array(1, 2, 4, 5, 6, 7, 9, 3, 8);//降序,插入4
array(1, 2, 4, 5, 6, 7, 9, 3, 8);//升序,不用操作
array(1, 2, 3, 4, 5, 6, 7, 9, 8);//降序,插入3
array(1, 2, 3, 4, 5, 6, 7, 8, 9);//降序,插入8,结果