二分查找
递归
function bin_search($array, $low, $high, $target){
if ( $low <= $high){
var_dump($low, $high);echo "\n";
$mid = intval(($low+$high)/2 );
if ($array[$mid] == $target){
return true;
}elseif ( $target < $array[$mid]){
return bin_search($array, $low, $mid-1, $target);
}else{
return bin_search($array, $mid+ 1, $high, $target);
}
}
return false;
}
$array = [1,3,6,9,13,18,19,29,38,47,51,56,58,59,60,63,65,69,70,71,73,75,76,77,79,89];
$target = 73;
$low = 0;
$high = count($array)-1;
$find = bin_search($array, $low, $high, $target);
var_dump($find);
非递归
function bin_search($array, $target)
{
$low = 0;
$high = count($array)-1;
$find = false;
while (true){
if ($low <= $high){
var_dump($low, $high);echo "\n";
$mid = intval(($low + $high)/2);
if ($array[$mid] == $target){
$find = true;
break;
} elseif ($array[$mid] < $target){
$low = $mid+1;
} elseif ($array[$mid] > $target){
$high = $mid-1;
}
} else {
break;
}
}
return $find;
}
$array = [1,3,6,9,13,18,19,29,38,47,51,56,58,59,60,63,65,69,70,71,73,75,76,77,79,89];
$target = 73;
$find = bin_search($array, $target);
var_dump($find);
冒泡排序
$arr = [3,4,2,1,5,6,7,8];
function bubbleSort($arr){
// 数组长度
$len = count($arr);
$sort_border =$len-1;
// 通过第一个for循环控制数据比较的轮次数
for($i=0;$i < $len;$i++){
// 第二次for循环控制次数并判断数据大小来交换位置
// 打标记
$flag = true;
for($j = 0;$j < $sort_border;$j++){
if($arr[$j] > $arr[$j+1]){
// 将第二个数赋给临时变量$stmp
$stmp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $stmp;
$flag = false;
$last = $j;
}
}
$sort_border = $last;
if ($flag) {
break;
}
}
return $arr;
}
print_r(bubbleSort($arr));
快排 (递归)
function quick_sort($a)
{
// 判断是否需要运行,因下面已拿出一个中间值,这里<=1
if (count($a) <= 1) {
return $a;
}
$middle = $a[0]; // 中间值
$left = array(); // 接收小于中间值
$right = array();// 接收大于中间值
// 循环比较
for ($i=1; $i < count($a); $i++) {
if ($middle < $a[$i]) {
// 大于中间值
$right[] = $a[$i];
} else {
// 小于中间值
$left[] = $a[$i];
}
}
// 递归排序划分好的2边
$left = quick_sort($left);
$right = quick_sort($right);
// 合并排序后的数据,别忘了合并中间值
return array_merge($left, array($middle), $right);
}
$a = [1,2,3,4,4,1,5,6,8,99,12,13,1,5];
echo "<pre>";
print_r(quick_sort($a));
快排 (非递归)
/**
* 快速排序算法
*
* @param array $arr 无序数组
* @return array $arr 有序数组
*/
function quick_sort($arr)
{
if (empty($arr) || count($arr) < 2) {
return $arr;
}
$sarr[0] = ['left'=>0,'right'=>count($arr) - 1]; //该数组保存需要排序的子数组边界
$i = 0;
$n = 1;
while($i < $n){ //判断还有未排序子数组存在
$left = $sarr[$i]['left']; //数组左边界下标
$right = $sarr[$i]['right']; //数组右边界下标
//随机获得关键值
$k = rand($left, $right-1);
$t = $arr[$left];
$arr[$left] = $arr[$k];
$arr[$k] = $t;
$key = $left; //关键值 -- 放到第一位
$f = false; //标志位
while($left <= $right) {
if($f == false) {
if($arr[$right] < $arr[$key]) {
$t = $arr[$key];
$arr[$key] = $arr[$right];
$arr[$right] = $t;
$key = $right;
$f = true;
}
$right--;
}
if($f) {
if($arr[$left] > $arr[$key]) {
$t = $arr[$key];
$arr[$key] = $arr[$left];
$arr[$left] = $t;
$key = $left;
$f = false;
}
$left++;
}
}
//保存入边界数组
if($sarr[$i]['left'] < $key - 1) {
$sarr[$n++] = ['left'=>$sarr[$i]['left'], 'right'=>$key-1];
}
if($sarr[$i]['right'] > $key + 1) {
$sarr[$n++] = ['left'=>$key + 1, 'right'=>$sarr[$i]['right']];
}
$i++;
}
return $arr;
}