編程過程中經常用到的算法

一、選擇排序

        選擇排序是通過每一趟排序過程中從待排序記錄中選擇出關鍵字最小(大)的記錄,將其依次放在數據表的最前或最後端的方法來實現整個數據表的有序排列

function selectSort(&$arr)
{
    $len = count($arr);
    for($i=0;$i<$len;$i++){
        $location = $i;
        for($j=$i+1;$j<$len;$j++){
            if($value > $arr[$j]){
                $location = $j;
            }
        }

        if($location != $i){
            $change = $arr[$i];
            $arr[$i] = $arr[$location];
            $arr[$location] = $change;
        }

    }
}

二、快速排序

        通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

function quickSort($arr)
{
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    $key = $arr[0];
    $left = array();
    $right = array();
    for($i=1;$i<$len; $i++){
        $val = $arr[$i];
        if($val <= $key){
            $left[] = $val;
        }else{
            $right[] = $val;
        }
    }

    $left = quickSort($left);
    $right = quickSort($right);
    return array_merge($left,array($key),$right);
    
}

三、插入排序

       通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應的位置並插入

function insertSort(&$arr)
{
    for($i=1;$i<count($arr);$i++){
        if($arr[$i-1] > $arr[$i]){
            $temp = $arr[$i];
            $j = $i;
            while($j>0 && $arr[$j-1] > $temp){
                $arr[$j] = $arr[$j-1];
                $j--;
            }
            $arr[$j] = $temp;
        
        }
    
    }

}

四、堆排序

        堆排序是指利用堆這種數據結構所設計的一種排序。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質,即子結點的鍵值或索引總是小於(或者大於)它的父節點。

function exchange(&$a,&$b){
        $temp = $b;
        $b = $a;
        $a = $temp;
}

function left($i){ return $i*2+1;}
function right($i){ return $i*2+2;}

function buildHeap(&$array,$i,$heapsize){

        $left = left($i);
        $right = right($i);
        $max = $i;
        if($i < $heapsize && $left<$heapsize  && $array[$left] > $array[$i] ){
                $max = $left;
        }

        if($i < $heapsize && $right<$heapsize && $array[$right] > $array[$max]){
                $max = $right;
        }
        if($i != $max && $i < $heapsize && $max < $heapsize){

                exchange($array[$i],$array[$max]);
                buildHeap($array,$max,$heapsize);

        }
}

function sortHeap(&$array,$heapsize){
        while($heapsize){
                exchange($array[0],$array[$heapsize-1]);
                $heapsize = $heapsize -1;
                buildHeap($array,0,$heapsize);
        }
}

function createHeap(&$array,$heapsize){
        $i = ceil($heapsize/2)-1;
        for(;$i>=0;$i--){
                buildHeap($array,$i,$heapsize);
        }
}

function main(){
        $array = array(88,99,22,11,22,13,9,2,1,100,12);
        $heapsize = count($array);
        createHeap($array,$heapsize);
        sortHeap($array,$heapsize);
}

五、冒泡排序

        冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端。

function bubbleSort(&$arr)
{
    $len = count($arr);
    for($i=0;$i<$len;$i++){
        for($j=$i+1;$j<$len;$j++){
            if($arr[$i] > $arr[$j]){
                $temp = $arr[$i];
                $arr[$i] = $arr[$j];
                 $arr[$j] = $temp;
             }
         }
    }
}

六、歸併排序

        歸併排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個有序的子序列,再把有序的子序列合併爲整體有序序列。概念不好理解,見下圖:

function merge(&$arr,$start,$mid,$end)
{
    $i = $start;
    $j = $mid + 1;
    $k = 0;
    $newArr = array();
    while($i <= $mid && $j<= $end){
        if($arr[$i] <= $arr[$j]){
           $newArr[$k++] = $arr[$i++]; 
        }else{
           $newArr[$k++] = $arr[$j++];
        }
    }
    while($i <= $mid ){
        var_dump($k);
        $newArr[$k++] = $arr[$i++];
    }

    while($j <= $end ){
        var_dump($k);
        $newArr[$k++] = $arr[$j++];
    }
    for($i=0;$i<$k;$i++){
        $arr[$i+$start] = $newArr[$i];
    }

}

function mergeSort(&$arr,$low,$high)
{
    if($low < $high){
        $mid = floor(($low+$high)/2);
        mergeSort($arr,$low,$mid);
        mergeSort($arr,$mid+1,$high);
        merge($arr,$low,$mid,$high);
    }
}

各個排序算法的時間複雜度如下:


     


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