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

递归实现冒泡排序:n递增的写法是否符合递归规范?

递归实现冒泡排序:递增参数的写法是否错误?

问题描述

我在编写递归实现冒泡排序的方法时,将基准情况设为数组长度,递归调用时n从0递增至array.length-1。但看到他人的代码均将基准情况设为1,递归时n从array.length递减至1。我知道两种写法的递归次数相同、输出结果一致,但查阅递归定义发现输入应逐渐减小,而我的代码中n是递增的,因此疑惑:即便输出正确,我的写法是否错误?

我的代码

import java.util.Arrays;

public class BubbleSort {
    public static void bubbleRecursion(int arr[],int n){
        if (n==arr.length){
            System.out.println(Arrays.toString(arr));
            return;
        }
        for (int i = 0;i<arr.length-1-n;i++){
            if (arr[i]>arr[i+1]){
                int temp;
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        bubbleRecursion(arr, n+1);
    }

    public static void main(String[] args) {
        int[] array = {3,1,4,1,5,9,2,6};
        bubbleRecursion(array,0);
    }
}

他人代码

public class BubbleSort {
    public static void sortingRecursion(int[] arr, int n){
        if (n == 1){
            return;
        }
        for (int i = 0;i < n-1;i++){
            if (arr[i]>arr[i+1]){
                int temp;
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        sortingRecursion(arr, n-1);
    }

    public static void main(String[] args) {
        int[] array = {3,1,4,1,5,9,2,6};
        sortingRecursion(array, array.length);
        System.out.println(Arrays.toString(array));
    }
}

解答

你的写法完全正确,不存在错误,只是递归的「问题规模」定义角度不同而已。

递归的核心是把问题拆解为规模更小的子问题,直到触达基准情况,但这里的「规模大小」不是看参数的数值增减,而是看参数对应的待处理问题的范围:

  • 他人的代码中,n代表当前需要处理的数组长度,每次递归n-1,意味着待排序的未有序部分长度在减小,符合直观的「问题规模缩小」;
  • 你的代码中,n代表已经完成排序的尾部元素个数,每次递归n+1,本质是未排序的前半部分长度在递减(arr.length-1-n就是未排序区间的上限),问题规模同样在缩小,只是用已完成的部分来衡量而已。

两种写法的逻辑等价:

  1. 他人代码每次把最大的元素「冒」到当前未排序区间的末尾;
  2. 你的代码每次也是把最大的元素冒到末尾,n记录已经排好的尾部元素数量,所以循环的上限是arr.length-1-n,避免重复处理已经有序的尾部。

另外,你的代码在基准情况时直接打印数组,而他人代码是返回后再处理打印,这只是输出时机的差异,不影响排序逻辑的正确性。

总结:递归的核心是问题规模的拆解,参数的增减只是表象,只要每次递归都在逼近基准情况,且逻辑正确,就没有问题。你的实现完全符合递归的要求,是正确的写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:25:22