导航

插入算法

Posted on 2020-11-10 11:37  玻璃星  阅读(60)  评论(0编辑  收藏  举报
<?php
function insertion_sort(&$arr){
    $count = count($arr);
    for($i=0;$i<$count-1;$i++){
        for($j=$i+1;$j<$count;$j++){
            if($arr[$j]<$arr[$i]){
                $arr[$i] = $arr[$i]^$arr[$j];//注释$arr[$i]、$arr[$j],为他们的原始值
                $arr[$j] = $arr[$i]^$arr[$j];//$arr[$i]^$arr[$j]^$arr[$j] = $arr[$i]
                $arr[$i] = $arr[$i]^$arr[$j];//($arr[$i]^$arr[$j])^($arr[$i]^$arr[$j]^$arr[$j]) = $arr[$j]
            }else{
                //这个$arr用例中,加了break后比较次数从36次降到了16次
                break;
            }
        }
    }
}

$arr = [5,4,3,2,1,9,8,7,6];
insertion_sort($arr);
echo '<pre/>';
print_r($arr);

//结果
//Array
//(
//    [0] => 1
//    [1] => 2
//    [2] => 3
//    [3] => 4
//    [4] => 5
//    [5] => 6
//    [6] => 7
//    [7] => 8
//    [8] => 9
//)