求仅含两个参数的递归选择排序实现(Java/伪代码)
递归选择排序(仅排序前k+1个元素)的实现
看起来你已经搭好了递归选择排序的初步框架,但卡在了else块的逻辑上——而且你明确要求只能用指定的两个参数、不能额外创建方法,没问题,我来帮你理清思路并补全代码。
首先先纠正一个关键语法错误:你的终止条件里写的是if (k = 0),这是赋值语句,会导致编译报错,应该改成if (k == 0)(相等判断)。
接下来回忆选择排序的核心逻辑:每一轮从待排序区间中选出极值(最大或最小),放到已排序区间的边界。针对你要排序前k+1个元素的需求,递归的正确思路是:
- 终止条件:当
k=0时,前1个元素(索引0)天然有序,直接返回数组; - 递归步骤:
- 在
0~k的范围内找到最大元素的索引(我们把最大元素放到k位置,让它成为前k+1个元素的有序末尾); - 如果最大元素不在k位置,就交换两者的位置;
- 递归调用
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个元素):
- 首次调用
k=2:在0~2区间找到最大元素是6(索引0),交换索引0和2的元素,数组变为{5,3,6,7,2},随后递归调用k=1; - 第二次调用
k=1:在0~1区间找到最大元素是5(索引0),交换索引0和1的元素,数组变为{3,5,6,7,2},随后递归调用k=0; - 触发终止条件,返回数组,最终结果完全符合你的预期。
如果需要实现升序排序(把最小元素放到区间起始),只需要把找最大元素的逻辑改成找最小元素即可,但当前实现已经满足你给出的测试场景需求。另外,这个实现是原地排序,会直接修改传入的数组,如果你需要保留原数组,可以在sort方法里先复制一份再传入。
内容的提问来源于stack exchange,提问作者iCV
相关产品推荐
相关产品推荐

