求助完善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
相关产品推荐
相关产品推荐

