希尔排序算法-php实现

<?php
/*
 * Shell‘s sort
 * 希尔排序 又称 缩小增量排序(是对插入排序的一种改进)
 * 设计思想:
 *    设定一个元素间隔增量gap,
 *    将参加排序的序列按着个间隔数gap从第一个元素开始依次分成若干个子序列。
 *    在子序列中应用其他排序方式。
 *    然后缩小增量,重新将整个序列按照新的间隔数gap进行划分和排序。
 *    知道间隔数增量gap=1为止。
 * 难点 :选取最合适的间隔数序列才能达到最优的排序效果。
 * 
 * [email protected]
 * 2013-10-24 
 */


$a = array(2, 5, 6, 3, 7, 8, 0, 9, 12, 1);


echo "\n".str_repeat("=", 100)."\n";
echo "The orginal data array is \n";
echo implode("\t", $a) . "\n";


$rs = shellsort($a, count($a));


echo "\n".str_repeat("=", 100)."\n";
echo "The result of Shell's sorting for the array is \n";
echo implode("\t", $rs) . "\n";

echo "\n".str_repeat("=", 100)."\n\n";


function shellsort(array $a, $cnt) {
    $gap = $cnt;
    while ($gap > 1) {
        $gap = $gap / 2;  /* 增量缩小,每次减半 */
        do { /* 子序列应用冒泡排序 */
            $flag = 0;
            /* 第i个元素跟第i+gap增量的元素做对比
             * 对比n-gap次
             * gap越小,对比跨度越小!
             */
            for ($i = 0; $i < $cnt - $gap; $i++) {
                $j = $i + $gap;
                if ($a[$i] < $a[$j]) {
                    $tmp = $a[$i];
                    $a[$i] = $a[$j];
                    $a[$j] = $tmp;
                    $flag = 1;
                }
            }
        } while ($flag != 0);
    }
    return $a;
}


?>

你可能感兴趣的:(希尔排序算法)