二分查詢,氣泡排序
阿新 • • 發佈:2018-12-20
<?php class Test { /** * 二分查詢 -- 要求:陣列必須為已排好序的 * 思路:無限切割即可,注意終止條件 * @param $x int 想要查詢的數字 * @param $arr array 已排好序的陣列 * @param int $start int 開始查詢位置索引 * @param int|null $end end 結束查詢位置索引 * @return int|null int<索引值。從0開始> null<代表查無此數> */ publicfunction binarySearch($x, $arr, $start = 0, $end = null) { $count = count($arr); if ($end === null) { $end = $count - 1; } if ($start + 1 >= $end) { if (($arr[$end] !== $x)) { return null; } else {return $arr[$end]; } } $mid = $start + intval(($end - $start)/ 2); if ($arr[$mid] === $x) { return $mid; } elseif ($arr[$mid] > $x) { return $this->binarySearch($x, $arr, 0, $mid); } elseif ($arr[$mid < $x]) {return $this->binarySearch($x, $arr, $mid, $end); } } /** * 氣泡排序 * 思路: * * 如原始有X個值需要排序 * * 控制最大的值一直往右移動,第一次迴圈必然造成最大的值會在最右側 * * 重複以上過程,冒泡 X-1, X-2, X-3...之間的值 * @param $arr array 需排序的陣列 * @return array 排序結果 */ public function bubbleSort($arr) { $lastIndexer = count($arr) - 1; // 最大的索引 for ($i = 0; $i < $lastIndexer; $i++) { for ($j = 0; $j < $lastIndexer - $i; $j++) { if ($arr[$j] > $arr[$j + 1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; } } } return $arr; } /** * 氣泡排序2 * 實現思路2,遞迴 * @param $arr array 需排序的陣列 * $param $lastIndexer int|null 需檢測的最大索引 * @return array 排序結果 */ public function bubbleSort2($arr, $lastIndexer = null) { if ($lastIndexer === null) { $lastIndexer = count($arr) - 1; } if ($lastIndexer === 0) { return $arr; } for($i = 0; $i < $lastIndexer; $i++) { if ($arr[$i] > $arr[$i + 1]) { $tem = $arr[$i + 1]; $arr[$i + 1] = $arr[$i]; $arr[$i] = $tem; } } return $this->bubbleSort2($arr, $lastIndexer - 1); } } $test = new Test(); // 二分查詢 $arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; $x = 10; $index = $test->binarySearch($x, $arr); var_dump($index); // 氣泡排序 $arr2 = [2, 3, 1, 6, 9, 8, 0, 5, 4, 7]; $bubbleResult = $test->bubbleSort($arr2); print_r($bubbleResult); $bubbleResult2 = $test->bubbleSort2($arr2); print_r($bubbleResult2);