1、冒泡排序
/**
* 冒泡排序
* 先找出最大的放在最后面
*
* @param $arr
*
* @return mixed
*/
function bubbleSort($arr) {
$length = count($arr);
for ($i = 1; $i < $length; $i++) {
for ($j = 0; $j < $length - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$temp = $arr[$j + 1];
$arr[$j + 1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
2、选择排序
/**
* 选择排序
* 先找出最小的放在最前面
**/
function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
//先假设最小的值的位置
$p = $i;
for ($j = $i + 1; $j < $len; $j++) {
//$arr[$p] 是当前已知的最小值
if ($arr[$p] > $arr[$j]) {
//比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
$p = $j;
}
}
//已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
if ($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最终结果
return $arr;
}
3、插入排序
/**
* 插入排序
*
* @param $arr
*
* @return mixed
*/
function insertSort($arr) {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$tmp = $arr[$i];
//内层循环控制,比较并插入
for ($j = $i - 1; $j >= 0; $j--) {
if ($tmp < $arr[$j]) {
//发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
$arr[$j + 1] = $arr[$j];
$arr[$j] = $tmp;
} else {
//如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
break;
}
}
}
return $arr;
}
4、快速排序
function quickSort($a) {
// 判断是否需要运行,因下面已拿出一个中间值,这里<=1
if (count($a) <= 1) {
return $a;
}
$middle = $a[0]; // 中间值
$left = []; // 接收小于中间值
$right = [];// 接收大于中间值
// 循环比较
for ($i = 1; $i < count($a); $i++) {
if ($middle < $a[$i]) {
// 大于中间值
$right[] = $a[$i];
} else {
// 小于中间值
$left[] = $a[$i];
}
}
// 递归排序划分好的2边
$left = quickSort($left);
$right = quickSort($right);
// 合并排序后的数据,别忘了合并中间值
return array_merge($left, [$middle], $right);
}
5、二分查找
function search($arr,$low, $high, $search) {
$mid = intval(($low + $high) / 2);
if ($arr[$mid] == $search) {
return $mid;
}
if ($arr[$mid] > $search) {
return searchTwo($low, $mid - 1, $search);
}
if ($arr[$mid] < $search) {
return searchTwo($mid + 1, $high, $search);
}
}