php 4大基礎算法

  /**
     * 冒泡排序
     * 思路:​每次循環排列出一個最大的數
     */
    public function mao_paoOp(){
        $data = array(5,2,6,4,3,1,9,8,4,5,14,25,41,12,52,32,42);
        $total = count($data);
        //循環控制需要冒的輪數
        for($i=0; $i<$total ; $i++){
            //每輪 冒出的數 比較
            for ($j=$i+1; $j<$total;$j++){
                if($data[$i]>$data[$j]){
                    //接收的空變量
                    $rem = $data[$i];
                    $data[$i] = $data[$j];
                    $data[$j] = $rem;
                }
            }
        }
        $this->response($data,2000);
    }
 /**
     * 選擇排序
     * 思路:每一趟在n-i+1(i = 1,2,…,n-1)個記錄中選擇關鍵字最小的記錄作爲有序序列中第i個記錄,
     * 其中最簡單的是簡單選擇排序,其過程如下:通過n-i次關鍵字間的比較,
     * 從n-i+1個記錄中選擇出關鍵字最小的記錄,並各第i個記錄交換之。
     */
    public function select_mathOp(){
        $data = array(5,2,6,4,3,1,9,8,4,5,14,25,41,12,52,32,42);
        $total = count($data);
        for ($i=0;$i<$total;$i++){
            //假設最小值位置
            $p = $i;
            //當前需要比較的元數  $i的後面
            for ($j=$i+1;$j<$total;$j++){
                if($data[$p]>$data[$j]){
                    //發現有更小的  記錄
                    $p = $j;
                }
            }

            //發現最小的和當前的位置不一樣 對調
            if($p !=$i){
                $tem = $data[$p];
                $data[$p] = $data[$i];
                $data[$i] = $tem;
            }
        }
        $this->response($data,2000);
    }
    /**
     * 插入排序
     * 思路:通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,
     * 通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,
     * 需要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間
     */
    public function insert_mathOp(){
        $data = array(5,2,6,4,3,1,9,8,4,5,14,25,41,12,52,32,42);
        $total = count($data);
        for ($i=1;$i<$total;$i++){
            $tmp = $data[$i];
            for ($j=$i-1;$j>=0;$j--){
                if($tmp<$data[$j]){
                    $data[$j+1] = $data[$j];
                    $data[$j] = $tmp;
                }else{
                    break;
                }
            }
        }
        $this->response($data,2000);
    }

 /**
     * 快速排序
     * 思路:先對數組進行分割, 把大的元素數值放到一個臨時數組裏,
     * 把小的元素數值放到另一個臨時數組裏(這個分割的點可以是數組中的任意一個元素值,一般用第一個元素,即$array[0]),
     * 然後繼續把這兩個臨時數組重複上面拆分,最後把小的數組元素和大的數組元素合併起來。這裏用到了遞歸的思想。
     */
    public function quick_sort_mathOp(){
        $data = array(5,2,6,4,3,1,9,8,4,5,14,25,41,12,52,32,42);
        $data_tmp = $this->quick_sort($data);
        $this->response($data_tmp,2000);
    }

   /**
     * 使用遞歸方式
     * @param $data
     * @return array
     */
    public function quick_sort($data){
        $total = count($data);
        //遞歸的時候 要防止死循環
        if($total<=1){
            return $data;
        }
        $base_num = $data[0];
        $left_data   = array(); //小於
        $right_data  = array();  //大於
        for ($i=1;$i<$total;$i++){
            if($base_num>$data[$i]){
                $left_data[] = $data[$i];
            }else{
                $right_data[] = $data[$i];
            }
        }
        $left_data = $this->quick_sort($left_data);
        $right_data = $this->quick_sort($right_data);
        $data_tmp = array_merge($left_data,array($base_num),$right_data);
        return $data_tmp;
    }





發佈了31 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章