插入排序类似于我们插入扑克牌的过程:拿到一张新牌,与手中的牌比较(倒序),如果被比较的牌比新牌大,被比较的牌向后移空出新牌的位置,否则终止比较,空出来的位置就是新牌应该插入的位置。

static public function insertSort(&$arr){
    if(!is_array($arr)){
        return false;
    }
    $len = count($arr);
    // 对应摸牌过程
    for($i=1;$i<$len;$i++){
        $item = $arr[$i];
        // 与手中已有的牌比较的过程
        for($j=$i;$j>0;$j--){
            if($arr[$j-1]>$item){
                $arr[$j] = $arr[$j-1];
            }else{
                break;
            }
        }
        $arr[$j] = $item;
    }
    return true;
}

上面是对应的实现,第一层循环是拿取一张新牌的过程(默认手中有张牌),第二层循环是新牌与手中的牌比较的过程。

这个算法的时间复杂度和冒泡排序是一样的,最好的情况下(顺序)是O(n),最坏的情况下(逆序)是O(n^2)。

results matching ""

    No results matching ""