PHP基礎算法(冒泡)(選擇)(二分查找)

今天有點時間,回顧一下PHP的基本算法,好久沒寫了,今天覆習一下,免得忘記了!!!

冒泡排序

相鄰兩個元素比較,小於(或大於)則交換兩個元素的位置,直到走完所有的元素。

時間複雜度O(N^2)

/**
 * @param $arr
 * @return mixed
 * 冒泡排序
 */
function MaopaoSort($arr){
//    $arr = ['9','1','0'];
    for ($i = 0;$i<count($arr);$i++){
        for($j = 0;$j<count($arr)-$i-1;$j++){
            if($arr[$j]>$arr[$j+1]){
                swap($arr[$j],$arr[$j+1]);
            }
        }
    }
    return $arr;
}
function swap(&$a,&$b){
    $temp = $a;
    $a = $b;
    $b = $temp;
}

快速排序:

在數組中挑出一個元素(多爲第一個)作爲基本值,掃描一遍數組將比基本值小的元素排在基本值左邊,將所有比基本值大的元素排在基本值之後,通過遞歸將各子序列分別劃分爲更小的序列直到所有的序列順序一致,最後將數組合並起來。記得將基本值加在左邊數組與右邊數組之間。

/**
 * @param $arr
 * @return array
 * 快速排序
 */
function QuickSort($arr){

    if(count($arr)<=1){
        return $arr;
    }
    $tmp = $arr[0];
    $left = array(); // 小於中間值
    $right = array();// 大於中間值
    for($i=1;$i<count($arr);$i++){
        if($arr[$i]<$tmp){
            $left[] = $arr[$i];
        }else{
            $right[] = $arr[$i];
        }
    }

    $left = QuickSort($left);
    $right = QuickSort($right);

    return array_merge($left,array($tmp),$right);
}

二分查找

對於給定值val,從序列的中間位置開始比較,如果當前位置值等於val,則查找成功;若val小於當前位置值,則在數列的前半段中查找;若val大於當前位置值則在數列的後半段中繼續查找,直到找到爲止。(數據量大的時候使用)

/**
 * @param $arr
 * 二分查找
 * $low 最小位置
 * $high 最大位置
 * $val 目標值
 * $arr 目標數組
 */
function BinSearch($low,$high,$val,$arr){
    if ( $low <= $high){
        $mid =  intval(($low+$high)/2 );
        if ($arr[$mid] ==  $val){
            return $mid;
        }elseif ( $val < $arr[$mid]){
            return  BinSearch($arr, $low,  $mid-1, $val);
        }else{
            return  BinSearch($arr, $mid+ 1, $high, $val);
        }
    }
    return -1;
}

 

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