排序查找算法

这篇博客介绍了二分查找的递归和非递归实现,以及冒泡排序和快速排序(包括递归和非递归)的详细步骤。通过示例代码展示了这些经典算法在数组操作中的应用,有助于理解排序和查找算法的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找

递归



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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值