一些常見的排序算法(php語言)

<?php
#直接插入排序,穩定
function InsertSort(&$arr){
    $tmp=0;
    $len=count($arr);
    for ($i=1;$i<$len;$i++){
        $tmp=$arr[$i];
        $j=$i-1;
        while ($tmp<$arr[$j]){
            $arr[$j+1]=$arr[$j];
            $j--;
        }
        $arr[$j+1]=$tmp;
    }
}

#折半插入排序,穩定
function BinInsertSort(&$arr){
    $tmp=0;
    $len=count($arr);
    for ($i=1;$i<$len;$i++){
        $tmp=$arr[$i];
        $low=0;
        $high=$i-1;
        while($low<=$high){
            $mid=ceil(($low+$high)/2);
            if ($tmp<$arr[$mid]){
                $high=$mid-1;
            }else{
                $low=$mid+1;
            }
        }

        for ($j=$i-1;$j>=$low;$j--){
            $arr[$j+1]=$arr[$j];
        }
        $arr[$low]=$tmp;
    }
}

#希爾排序,不穩定
function ShellInsert(&$arr,$d,$len){
    for ($i=$d;$i<$len;$i++){
        if ($arr[$i]<$arr[$i-$d]){
            $tmp=$arr[$i];
            $j=$i-$d;
            while (($j>0)&&($tmp<$arr[$j])){
                $arr[$j+$d]=$arr[$j];
                $j=$j-$d;
            }
            $arr[$j+$d]=$tmp;
        }
    }
}

function ShellSort(&$arr){
    $len=count($arr);
    $d=$len;
    while($d>1){
        $d=ceil($d/2);
        ShellInsert($arr, $d, $len);
        echo '<br/>';
        print_r($arr);
        echo '<br/>';
    }
}



#冒泡排序,穩定
function BubbleSort(&$arr){
    $len=count($arr);
    do{
        $all=true;
        for ($m=0;$m<$len-1;$m++){
            $i=$m+1;
            if ($arr[$m]>$arr[$i]){
                $tmp=$arr[$m];
                $arr[$m]=$arr[$i];
                $arr[$i]=$tmp;
                $all=false;
            }
        }
        $len--;

    }while (($all==false)&&($len!=1));
}

#快速排序,穩定
function QuickSort(&$arr,$l,$p){
    $i=$l;
    $j=$p;
    $tmp=$arr[$i];
    do{
        while (($arr[$j]>=$tmp)&&($j>$i))
            $j--;
        if ($i<$j){
            $arr[$i]=$arr[$j];
            $i++;
            while (($arr[$i]<=$tmp)&&($i<$j))
                $i++;
            if ($i<$j){
                $arr[$j]=$arr[$i];
                $j--;
            }
        }

    }while ($i!=$j);

    $arr[$i]=$tmp;
    $j--;
    $i++;
    if ($l<$j)
        QuickSort($arr, $l, $j);
    if ($i<$p)
        QuickSort($arr,$i,$p);
}

function SelectionSort(&$arr){
    $len=count($arr);
    for ($i=0;$i<$len-1;$i++){
        $m=$i;
        for ($j=$i+1;$j<$len;$j++){
            if ($arr[$j]<$arr[$m])
                $m=$j;
        }
        if ($m!=$i){
            $tmp=$arr[$i];
            $arr[$i]=$arr[$m];
            $arr[$m]=$tmp;
        }
    }
}


$arr=array(2,3,4857,6,4,59,54,3,14,254);

echo "before <br/>";

var_dump($arr);

SelectionSort($arr);

echo "<br/>after <br/>";

var_dump($arr);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章