You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助完善PHP自定义Bell排序算法,返回修改后的数组

完善PHP版Bell排序算法的实现

我来帮你搞定这个Bell排序的PHP实现!首先得明确Bell排序的核心逻辑:它是一种双向选择排序,交替地把当前未排序区间的最小元素移到左端,最大元素移到右端,逐步缩小未排序范围,直到整个数组有序。

先看看你现有的代码片段:

<?php 
function bell_sort($arr, $head, $tail, $queue) { 
    if($head != $tail){ 
        $min = $arr[$head]; 
        $min_index = $head; 
        for($i = $head; $i <= $tail; ++$i){ 
            if($arr[$i] < $min){ 
                $min = $arr[$i]; 
                $min_index = $i; 
            } 
        } 
        if($queue){ 
            $tmp = $arr[$head]; 
            $arr[$head] = $arr[$min_index]; 
            $arr[$min_index] = $tmp; 
            $head++; 
        }else{ 
            $tmp = $arr[$tail]; 
            $arr[...

你已经完成了找最小元素放到头部的逻辑,但还缺少找最大元素放到尾部的完整实现、递归调用的逻辑以及终止条件的返回,这些都是让排序正常工作的关键。

完整的Bell排序实现代码

function bell_sort($arr, $head, $tail, $queue) {
    // 终止条件:当头部指针超过等于尾部指针,说明数组已完全有序
    if ($head >= $tail) {
        return $arr;
    }

    if ($queue) {
        // 第一阶段:在[head, tail]区间找到最小元素,交换到head位置
        $min = $arr[$head];
        $min_index = $head;
        for ($i = $head; $i <= $tail; ++$i) {
            if ($arr[$i] < $min) {
                $min = $arr[$i];
                $min_index = $i;
            }
        }
        // 交换最小元素到当前区间的头部
        $tmp = $arr[$head];
        $arr[$head] = $arr[$min_index];
        $arr[$min_index] = $tmp;
        // 递归处理剩余区间,切换为找最大元素的模式
        return bell_sort($arr, $head + 1, $tail, false);
    } else {
        // 第二阶段:在[head, tail]区间找到最大元素,交换到tail位置
        $max = $arr[$tail];
        $max_index = $tail;
        for ($i = $head; $i <= $tail; ++$i) {
            if ($arr[$i] > $max) {
                $max = $arr[$i];
                $max_index = $i;
            }
        }
        // 交换最大元素到当前区间的尾部
        $tmp = $arr[$tail];
        $arr[$tail] = $arr[$max_index];
        $arr[$max_index] = $tmp;
        // 递归处理剩余区间,切换为找最小元素的模式
        return bell_sort($arr, $head, $tail - 1, true);
    }
}

// 示例调用
$test_array = [7, 2, 5, 1, 8, 3, 9, 4];
$sorted_array = bell_sort($test_array, 0, count($test_array) - 1, true);
print_r($sorted_array);

关键修改点说明

  • 终止条件:当$head >= $tail时,未排序的区间已经不存在,直接返回排序后的数组,结束递归。
  • 补全$queue=false分支:遍历当前区间找到最大元素,交换到$tail位置,然后递归处理缩小后的区间($tail-1),同时切换$queue为true,下一轮回到找最小元素的逻辑。
  • 递归返回结果:每个分支处理完交换后,必须递归调用并返回结果,这样排序后的数组才能逐层传递回来,最终得到完整的有序数组。
  • 示例调用:初始调用时,$head设为0,$tail设为数组最后一个元素的索引,$queue设为true(先从找最小元素开始)。

运行示例代码后,会输出有序数组:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 8
    [7] => 9
)

内容的提问来源于stack exchange,提问作者Tigran Mkrtchyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:59:38