本文涉及到 冒泡算法 选择排序 快速排序 归并排序 顺序查找 二分/折半查找
<?php
// 数组排序算法
// 冒泡算法 两个数字比较 较大的数字放到右边
$arr = array(9,5,6,1,89,6,6,1,2,3,6);
for($j = 0,$len = count($arr);$j < $len;$j++){
for($i =0,$len =count($arr);$i < $len-1-$j;$i++){
if($arr[$i] > $arr[$i+1]){
$temp = $arr[$i];
$arr[$i] = $arr[$i+1];
$arr[$i+1] = $temp;
}
}
}
echo '<pre>';
print_r($arr);
echo '<hr>';
// 选择排序
$arr1 = array(5,6,2,3,1,0);
for($i = 0,$len = count($arr1);$i < $len;$i++){
// 假定一个最小的
$min = $i;
// 用假定最小的和剩余其他的比较
for($j = $i+1;$j < $len;$j++){
// 当前比较的元素 < 假定的,把当前的下标赋值给min
if($arr1[$j] < $arr1[$min]){
$min = $j;
}
}
// 交换真正的最小值
if($min != $i){
$temp = $arr1[$i];
$arr1[$i] = $arr1[$min];
$arr1[$min] = $temp;
}
}
echo '<pre>';
print_r($arr);
echo '<hr>';
// 快速排序
$arr2 = [5,6,1,2,3,0];
function quick_sort($arr2){
// 递归出口 数组长度<=1时候就已经排好了
$len = count($arr2);
if($len <=1) return $arr2;
// 存放数组
$left = $right = array();
for($i =1;$i < $len;$i++){
// 一般情况下把第一个元素当作比较元素,比它小的放到left里面,大的放到right里面
if($arr2[$i] < $arr2[0]){
$left[] = $arr2[$i];
}else{
$right[] = $arr2[$i];
}
}
// 递归点
$left = quick_sort($left);
$right = quick_sort($right);
returnarray_merge($left,array($arr2[0]),$right);
}
echo '<pre>';
print_r(quick_sort($arr2));
echo '<hr>';
// 归并排序
// 二路归并 必须是两个有序数组
// $arr4 = [1,3,5];
// $arr5 = [2,3];
// // 创建一个空数组用于存放归并空间
// $arr6 = array();
// while (count($arr4) && count($arr5)) {
// $arr6[] = $arr4[0] < $arr5[0] ? array_shift($arr4) : array_shift($arr5);
// }
// print_r(array_merge($arr6,$arr4,$arr5));
$arr3 = [5,1,3,9,0];
function merge_sort($arr){
// 递归出口 数组长度<=1时候就已经排好了
$len = count($arr);
if($len <=1) return $arr;
// 拆分
$middle = floor($len/2);
$left = array_slice($arr,0,$middle);
$right = array_slice($arr,$middle);
// 递归点,保证left和right为有序数组
$left = merge_sort($left);
$right = merge_sort($right);
$m = array();
while (count($left) &&count($right)) {
// 只要left right里面有元素,就进入循环
// 取出left right里面的第一个元素进行比较 哪个小就把小的放入m中
$m[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
}
return (array_merge($m,$left,$right));
}
print_r(merge_sort($arr3));
echo '<hr>';
// 查找算法
// 顺序查找
$arr4 = [8,9,7,12,0];
functioncheck_order($arr,$num){
for($i =0,$len =count($arr);$i < $len;$i++){
if($arr[$i] == $num){
return $i;
}
}
returnfalse;
}
var_dump(check_order($arr4,102));
// 二分/折半 查找
$arr5 = [1,5,7,15,98,120];
$ress = 5;
functioncheck_break($arr,$ress){
// 取得边界
$right = count($arr);
$left = 0;
while ($left <= $right) {
// 得到中间值
$middle = floor(($left + $right)/2);
// 匹配数据
if($arr[$middle] == $ress){
return $middle +1;
}
// 值在右边
if($arr[$middle] < $ress){
$left = $middle + 1;
}else{
$right = $middle - 1;
}
}
returnfalse;
}
var_dump(check_break($arr5,$ress));