十大排序算法之希尔排序(Shell Sort)

  • 将数组中数据依次按照增量序列{n/2,(n/2)/2…1}分组
  • 将每次按照增量分组的数组插入排序
  • 重复直到增量为1

例:$arr = [8,9,1,7,2,3,4,5,6,0]

第一次分组增量为gap = length/2=10/2=5,则将数组分成5组 [ a r r [ 0 ] , arr[0], arr[5]],[ a r r [ 1 ] , arr[1], arr[6]],[ a r r [ 2 ] , arr[2], arr[7]],[ a r r [ 3 ] , arr[3], arr[8]],[ a r r [ 4 ] , arr[4], arr[9]],对这五组数据分别进行插入排序
第二次分组增量为gap = gap/2=5/2=2,将数组分成两组,每组五个数据[ a r r [ 0 ] , arr[0], arr[2], a r r [ 4 ] , arr[4], arr[6], a r r [ 8 ] ] , [ arr[8]],[ arr[1], a r r [ 3 ] , arr[3], arr[5], a r r [ 7 ] , arr[7], arr[9]],对这两组数据分别进行插入排序
第三次分组增量为 gap=gap/2=2/2=1,对前面排完序后的[ a r r [ 0 ] , arr[0], arr[1], a r r [ 2 ] , arr[2], arr[3], a r r [ 4 ] , arr[4], arr[5], a r r [ 6 ] , arr[6], arr[7], a r r [ 8 ] , arr[8], arr[9]]进行插入排序

<?php
function shellSort($arr) {
    $len = count($arr);
    for ($gap = floor($len/2);$gap > 0; $gap = floor($gap / 2)) {
        for ($i = $gap; $i < $len; $i++) {
            $j = $i;
            $current = $arr[$i];
            while ($j - $gap >= 0 && $current < $arr[$j - $gap]) {
                $arr[$j] = $arr[$j - $gap];
                $j = $j - $gap;
            }
            $arr[$j] = $current;
        }
    }
    return $arr;
}
print_r(shellSort([8,9,1,7,3,5,4,6,0]));
发布了13 篇原创文章 · 获赞 3 · 访问量 1430

猜你喜欢

转载自blog.csdn.net/qq_34051908/article/details/104037684