php演算法學習記錄

來源:互聯網
上載者:User
<?php/** * Created by PhpStorm. * User: Administrator * Date: 2018/4/12 * Time: 22:22 */header("content-type:text/html;charset=utf-8");$arr = array(3,5,8,4,9,6,1,7,2);/** * 冒泡排序 * 思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。 * 思路:冒泡演算法是由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作冒泡排序。 * @param $arr * @return mixed *///print_r(insert_sort($arr));function BubbleSort($arr){      //從小到大排序    $length = count($arr);    if($length<=1){        return $arr;    }    for($i=0;$i<$length;$i++){        for($j=$length-1;$j>$i;$j--){            if($arr[$j]<$arr[$j-1]){                $tmp = $arr[$j];                $arr[$j] = $arr[$j-1];                $arr[$j-1] = $tmp;            }            //另外一種是每次單獨拿一個去跟後面的去比較---暫時不知道叫什麼            if ($arr[$j] < $arr[$i]) {                $temp = $arr[$j];                $arr[$j] = $arr[$i];                $arr[$i] = $temp;            }        }    }    return $arr;}#冒泡演算法(另一種寫法)function bubbleSort1($arr) {    $length = count($arr);        for ($i = 0;$i<$length;$i++) {                for ($j = 0;$j<$length-1;$j++) {        //每次它的極限就是比它此刻小一個的值                    if ($arr[$j] < $arr[$j + 1]) {                                    $temp = $arr[$j];                                   $arr[$j] = $arr[$j + 1];                                    $arr[$j + 1] = $temp;                                }//                                if ($arr[$j] > $arr[$i]) {//                                    $temp = $arr[$j];//                                    $arr[$j] = $arr[$i];//                                    $arr[$i] = $temp;//                                }                            }                        }                            return $arr;}/**                         * 快速排序                         * 思路:                         *      1.選擇最前面的值作為樞軸                         *      2.定義兩個數組                         *      3.把比樞軸小的放到左邊--比數軸大的放到右邊                         *      4.再遞迴使用本函數分別合并兩邊的結果,最終再把最初的數軸放中間合并返回結果                         * @param $arr * @return array                            //程式流程                            //樞軸為5 left 3,4,1,2  right 8,9,6,7                            //left 樞軸為3 left 1,2  right 4 樞軸為8 left6,7  right  9                            //左邊合并的結果  然後合并上最初的樞軸  再合并生右邊合并的結果                            //1,2,3,4    5    6,7,8,9 */function QSort($arr){                            $length = count($arr);    if($length <=1){                                return $arr;    }                            $pivot = $arr[0];//樞軸                            $left_arr = array();                            $right_arr = array();                            for($i=1;$i<$length;$i++){//注意$i從1開始0是樞軸                                if($arr[$i]<=$pivot){//                                    array_push($left_arr,$arr[$i]);                                    $left_arr[] = $arr[$i];                               //這種往數組裡添加值得方式相對快速                                }else{//                                    array_push($right_arr,$arr[$i]);                                    $right_arr[] = $arr[$i];                              //這種往數組裡添加值得方式相對快速                                }                            }                            $left_arr = QSort($left_arr);//遞迴排序左半部分                            $right_arr = QSort($right_arr);//遞迴排序右半部份                            print_r(array_merge($left_arr,array($pivot),$right_arr));                            echo "<br/>";                            return array_merge($left_arr,array($pivot),$right_arr);//合并左半部分、樞軸、右半部分}                        /**                         * 插入排序                         * 思路:                         * 將要排序的元素插入到已經 假定排序號的數組的指定位置。                         * @param $arr * @return mixed                            //程式流程                            //第一次進入 $tmp=5 for($j=$i-1;$j>=0;$j--)                          如果 5<3 不成立                            //第二次  $tmp=8 如果 8<5 不成立                            //第三次  $tmp=4 如果 4<8 8和4替換  結果為 3,5,4,8,9,6,1,7,2                            //第四次  $tmp=9 如果 9<8 不成立                            //                               $tmp=6 6<9  3,5,4,8,6,9,1,7,2                        //1<9 3,5,4,8,6,1,9,7,2                        //7<9 3,5,4,8,6,1,7,9,2                        //2<9 3,5,4,8,6,1,7,2,9 */                        function insert_sort($arr) {                            //找到其中一個需要排序的元素                            //這個元素 就是從第二個元素開始,到最後一個元素都是這個需要排序的元素                            //i迴圈控制 每次需要插入的元素,一旦需要插入的元素控制好了,                            //間接已經將數組分成了2部分,下標小於當前的(左邊的),是排序好的序列                            for($i=1, $len=count($arr); $i<$len; $i++) {                                //獲得當前需要比較的元素值。                                $tmp = $arr[$i];//                                echo "tmp=".$tmp."---";                                for($j=$i-1;$j>=0;$j--) {                                    if($tmp < $arr[$j]) {//                                        echo "如果".$tmp."<".$arr[$j]."的話。就替換成功";                                        //發現插入的元素要小,交換位置    //將後邊的元素與前面的元素互換                                        $arr[$j+1] = $arr[$j];                                        $arr[$j] = $tmp;                                    } else {//                                        echo "如果".$tmp."<".$arr[$j]."的話。就替換失敗";//                                        print_r($arr);//                                        echo "<br/>";                                        break;                                    }//                                    print_r($arr);//                                    echo "<br/>";                                }                            }                            return $arr;}                        /**                         * 順序尋找                         * @param $arr                         * @param $key                         * @return int                         *///$key = 2;                        //echo "<br/>順序常規尋找{$key}的位置:";                        //echo SqSearch($arr,$key);                        function SqSearch($arr,$key){                            $length = count($arr);                            for($i=0;$i<$length;$i++){                                if($key == $arr[$i]){                                    return $i+1;                                }                            }                            return -1;}                        /**                         *二分尋找(必須是一個有序的數組)                         * 假設我們的數組是一個遞增的數組,首先我們需要找到數組的中間位置.                         * 一。要知道中間位置就需要知道起始位置和結束位置,然後取出中間位置的值來和我們的值做對比。                         * 二。如果中間值大於我們的給定值,說明我們的值在中間位置之前,此時需要再次二分,                        因為在中間之前,所以我們需要變的值是結束位置的值,此時結束位置的值應該是我們此時的中間位置。                         * 三。反之,如果中間值小於我們給定的值,那麼說明給定值在中間位置之後,此時需要再次將後一部分的值進行二分,                        因為在中間值之後,所以我們需要改變的值是開始位置的值,此時開始位置的值應該是我們此時的中間位置,                        直到我們找到指定值。                            //程式流程                            //找6  $mid=4  6==5 6<5  6>5---->讓mid+1                            // mid=5 return 5+1 位置為6                         * @param $arr                         * @param $low      從第一個開始找(索引值0)                         * @param $high     結束點 (數組的長度)                         * @param $key * @return int                         *///$key = 6;//echo "二分尋找{$key}的位置:";                        //echo binary_search($arr,0,count($arr),$key);                        function binary_search($arr,$low,$high,$key){                            for($i=$low;$i<=$high;$i++){                                $mid = intval(($low+$high)/2);                        //        echo $mid;                          //不夠就是不夠,不會往上舍取                                if($key == $arr[$mid]){                                    return $mid+1;                                }elseif($key<$arr[$mid]){                                    $high = $mid-1;                                }elseif($key>$arr[$mid]){                                    $low = $mid+1;                                }                            }//                            while($low<=$high){//                                $mid = intval(($low+$high)/2);//                                if($key == $arr[$mid]){//                                    return $mid+1;//                                }elseif($key<$arr[$mid]){//                                    $high = $mid-1;//                                }elseif($key>$arr[$mid]){//                                    $low = $mid+1;//                                }//                            }                            return -1;                        }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.