国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 邏輯算法 > 正文

算法 PHP實現經典算法(上)

2020-03-22 17:38:59
字體:
來源:轉載
供稿:網友
  • 前言

    下面的是通過PHP實現經典算法,并計算了耗時,可以通過耗時對比這幾種算法的復雜度。

    插入排序 冒泡排序 選擇排序 并歸排序 快速排序

    CODE
    $arr = [];for ($i = 0; $i < 5000; $i++) {    $arr[] = rand(1, 10000);}//1 插入排序function insertionSort($arr){    for ($i = 1; $i < count($arr); $i++) {        $tmp = $arr[$i]; //設置監視哨        $key = $i - 1; //設置開始查找的位置        while ($key >= 0 && $tmp < $arr[$key]) { // 監視哨的值比查找的值小 并且 沒有到此次查詢的第一個            $arr[$key + 1] = $arr[$key];  //數組的值進行后移            $key--;  //要查找的位置后移        }        if (($key + 1) != $i) //放置監視哨            $arr[$key + 1] = $tmp;    }    return $arr;}$insertion_start_time = microtime(true);$insertion_sort = insertionSort($arr);$insertion_end_time = microtime(true);$insertion_need_time = $insertion_end_time - $insertion_start_time;print_r('插入排序耗時:' . $insertion_need_time . '<br />');//2 冒泡排序function bubbleSort($arr){    for ($i = 0; $i < count($arr); $i++) {        for ($j = 0; $j < $i + 1; $j++) {            if ($arr[$j] < $arr[$j - 1]) {                $temp = $arr[$j - 1];                $arr[$j - 1] = $arr[$j];                $arr[$j] = $temp;            }        }    }    return $arr;}$bubble_start_time = microtime(true);$bubble_sort = bubbleSort($arr);$bubble_end_time = microtime(true);$bubble_need_time = $bubble_end_time - $bubble_start_time;print_r('冒泡排序耗時:' . $bubble_need_time . '<br />');//3 選擇排序function selectionSort($arr){    $count = count($arr);    for ($i = 0; $i < $count - 1; $i++) {        //找到最小的值        $min = $i;        for ($j = $i + 1; $j < $count; $j++) {            //由小到大排列            if ($arr[$min] > $arr[$j]) {                //表明當前最小的還比當前的元素大                $min = $j;                //賦值新的最小的            }        }        /*swap$array[$i]and$array[$min]即將當前內循環的最小元素放在$i位置上*/        if ($min != $i) {            $temp = $arr[$min];            $arr[$min] = $arr[$i];            $arr[$i] = $temp;        }    }    return $arr;}$selection_start_time = microtime(true);$selection_sort = selectionSort($arr);$selection_end_time = microtime(true);$selection_need_time = $selection_end_time - $selection_start_time;print_r('選擇排序耗時:' . $selection_need_time . '<br />');//4 并歸排序//merge函數將指定的兩個有序數組(arr1arr2,)合并并且排序//我們可以找到第三個數組,然后依次從兩個數組的開始取數據哪個數據小就先取哪個的,然后刪除掉剛剛取過///的數據function al_merge($arrA, $arrB){    $arrC = array();    while (count($arrA) && count($arrB)) {        //這里不斷的判斷哪個值小,就將小的值給到arrC,但是到最后肯定要剩下幾個值,        //不是剩下arrA里面的就是剩下arrB里面的而且這幾個有序的值,肯定比arrC里面所有的值都大所以使用        $arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB);    }    return array_merge($arrC, $arrA, $arrB);}//歸并排序主程序function al_merge_sort($arr){    $len = count($arr);    if ($len <= 1)        return $arr;//遞歸結束條件,到達這步的時候,數組就只剩下一個元素了,也就是分離了數組    $mid = intval($len / 2);//取數組中間    $left_arr = array_slice($arr, 0, $mid);//拆分數組0-mid這部分給左邊left_arr    $right_arr = array_slice($arr, $mid);//拆分數組mid-末尾這部分給右邊right_arr    $left_arr = al_merge_sort($left_arr);//左邊拆分完后開始遞歸合并往上走    $right_arr = al_merge_sort($right_arr);//右邊拆分完畢開始遞歸往上走    $arr = al_merge($left_arr, $right_arr);//合并兩個數組,繼續遞歸    return $arr;}$merge_start_time = microtime(true);$merge_sort = al_merge_sort($arr);$merge_end_time = microtime(true);$merge_need_time = $merge_end_time - $merge_start_time;print_r('并歸排序耗時:' . $merge_need_time . '<br />');//5 快速排序function quickSort(&$arr){    if(count($arr)>1){        $k=$arr[0];        $x=array();        $y=array();        $_size=count($arr);        for($i=1;$i<$_size;$i++){            if($arr[$i]<=$k){                $x[]=$arr[$i];            }elseif($arr[$i]>$k){                $y[]=$arr[$i];            }        }        $x=quickSort($x);        $y=quickSort($y);        return array_merge($x,array($k),$y);    }else{        return$arr;    }}$quick_start_time = microtime(true);$quick_sort = al_merge_sort($arr);$quick_end_time = microtime(true);$quick_need_time = $quick_end_time - $quick_start_time;print_r('快速排序耗時:' . $quick_need_time . '<br />');

    耗時對比

    插入排序耗時:1.2335460186005
    冒泡排序耗時:2.6180219650269
    選擇排序耗時:1.4159741401672
    并歸排序耗時:0.17212891578674
    快速排序耗時:0.16736888885498

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 阿拉善左旗| 玛多县| 淳安县| 平舆县| 南部县| 苏尼特右旗| 淮安市| 盐津县| 积石山| 射阳县| 梅州市| 苍梧县| 绵竹市| 甘洛县| 石门县| 花垣县| 南城县| 南宫市| 高要市| 柳林县| 尼玛县| 辽阳市| 竹山县| 萨迦县| 方山县| 四子王旗| 台中县| 克东县| 施秉县| 汶川县| 开阳县| 缙云县| 浮梁县| 胶南市| 响水县| 沈丘县| 当雄县| 静乐县| 嘉定区| 镇平县| 台前县|