<?php
class Test {
/**
* 二分查找 -- 要求:数组必须为已排好序的
* 思路:无限切割即可,注意终止条件
* @param $x int 想要查找的数字
* @param $arr array 已排好序的数组
* @param int $start int 开始查找位置索引
* @param int|null $end end 结束查找位置索引
* @return int|null int<索引值。从0开始> null<代表查无此数>
*/
public function 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);
}
/**
* 快速排序
* @param $arr
*/
public function quickSort($arr) {
if (count($arr) > 1) {
$mid = array_pop($arr);
$min = []; // 更小的数据集合
$max = []; // 更大的数据集合
foreach ($arr as $k => $v) {
if ($v < $mid) {
$min[] = $v;
} else {
$max[] = $v;
}
}
// 分别对更小的以及更大的数进行快速排序
$min = $this->quickSort($min);
$max = $this->quickSort($max);
return array_merge($min, [$mid], $max);
} else {
return $arr;
}
}
}
$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);
// 快速排序
$quickSort = $test->quickSort($arr2);
print_r($quickSort);