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

求仅含两个参数的递归选择排序实现(Java/伪代码)

递归选择排序(仅排序前k+1个元素)的实现

看起来你已经搭好了递归选择排序的初步框架,但卡在了else块的逻辑上——而且你明确要求只能用指定的两个参数、不能额外创建方法,没问题,我来帮你理清思路并补全代码。

首先先纠正一个关键语法错误:你的终止条件里写的是if (k = 0),这是赋值语句,会导致编译报错,应该改成if (k == 0)(相等判断)。

接下来回忆选择排序的核心逻辑:每一轮从待排序区间中选出极值(最大或最小),放到已排序区间的边界。针对你要排序前k+1个元素的需求,递归的正确思路是:

  • 终止条件:当k=0时,前1个元素(索引0)天然有序,直接返回数组;
  • 递归步骤:
    1. 在0~k的范围内找到最大元素的索引(我们把最大元素放到k位置,让它成为前k+1个元素的有序末尾);
    2. 如果最大元素不在k位置,就交换两者的位置;
    3. 递归调用selectionSort(a, k-1),处理前k个元素(索引0~k-1),让它们也有序。

你原来的框架把递归调用放在了处理逻辑前面,这其实不符合选择排序的执行顺序——我们需要先处理当前k位置的极值交换,再递归处理前面的区间,这样才能实现正确的选择排序。

下面是完整的Java代码实现,严格遵循你的参数要求:

public int[] sort(int[] a) {
    // 若要排序整个数组,直接调用selectionSort处理到最后一个索引
    return selectionSort(a, a.length - 1);
}

public int[] selectionSort(int[] a, int k) {
    // 终止条件:前1个元素已天然有序
    if (k == 0) {
        return a;
    }
    
    // 步骤1:在0~k范围内找到最大元素的索引
    int maxIndex = 0;
    for (int i = 1; i <= k; i++) {
        if (a[i] > a[maxIndex]) {
            maxIndex = i;
        }
    }
    
    // 步骤2:如果最大元素不在k位置,交换两者
    if (maxIndex != k) {
        int temp = a[k];
        a[k] = a[maxIndex];
        a[maxIndex] = temp;
    }
    
    // 步骤3:递归处理前k个元素(索引0~k-1)
    return selectionSort(a, k - 1);
}

我们用你给出的测试用例验证一下:调用selectionSort(new int[]{6,3,5,7,2}, 2)(排序前3个元素):

  1. 首次调用k=2:在0~2区间找到最大元素是6(索引0),交换索引0和2的元素,数组变为{5,3,6,7,2},随后递归调用k=1;
  2. 第二次调用k=1:在0~1区间找到最大元素是5(索引0),交换索引0和1的元素,数组变为{3,5,6,7,2},随后递归调用k=0;
  3. 触发终止条件,返回数组,最终结果完全符合你的预期。

如果需要实现升序排序(把最小元素放到区间起始),只需要把找最大元素的逻辑改成找最小元素即可,但当前实现已经满足你给出的测试场景需求。另外,这个实现是原地排序,会直接修改传入的数组,如果你需要保留原数组,可以在sort方法里先复制一份再传入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:23