希尔排序

2020-05-07  本文已影响0人  X1_blog
/*希尔排序*/
$arr = [14,18,19,37,23,40,29,30,11,7,2,1,8,6,3,5,4] ;
$sorted_arr = shellSort($arr);
myPrint($sorted_arr);    // 1 2 3 4 5 6 7 8 11 14 18 19 23 29 30 37 40  [Finished in 0.1s]
 
function shellSort($arr){
    $count = count($arr);
    $gap_list = [] ;
    $gap = floor($count/2);
    while($gap>=1){
        $gap_list [] = $gap;
        $gap = floor($gap/2);
    }   // 获得间隔序列
    

    foreach ($gap_list as $gap) {
        $subUnsortArr = getGapArr($arr,$gap) ;  // 跳过间隔所构成子序列
        $subsortArr = insertSort($subUnsortArr);    // 插入排序法排序序列
        $arr = setGapArr($arr,$subsortArr,$gap);    // 将有序子序列重新插入回原数组
    }
    return $arr;
}


function getGapArr($arr,$gap){
    $gapArr= [];$i=0;
    while($i<count($arr)){
        $gapArr[] = $arr[$i];
        $i+=$gap;
    }
    return $gapArr;
}

function setGapArr($arr,$sortedArr,$gap){
    $i=0;
    while($i<count($arr)){
        $arr[$i] = array_shift($sortedArr);
        $i+=$gap;
    }
    return $arr;
}



function insertSort($arr){
    for ($i=1; $i <count($arr) ; $i++) { 
        $tmp = $arr[$i];
        for ($j=$i; $j>0 ; $j--) {
            if($tmp<$arr[$j-1]){
                $arr[$j] = $arr[$j-1] ;
            }else{
                break;
            }
        }
        $arr[$j] = $tmp;
    }
    return $arr;
}
上一篇下一篇

猜你喜欢

热点阅读