<?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; }