Java中的递归冒泡排序

Java中的递归冒泡排序,java,arrays,sorting,recursion,bubble-sort,Java,Arrays,Sorting,Recursion,Bubble Sort,我试图用Java编写一个递归冒泡排序,我得到了一个索引越界异常。我做错了什么?为什么我会犯这个错误? 这是我的密码: public static <T extends Comparable< ? super T>> void sort(T [] a){ T tmp; for(int i=0;i<a.length;i++){ if(a[i].compareTo(a[i+1])>0){ tmp =

我试图用Java编写一个递归冒泡排序,我得到了一个索引越界异常。我做错了什么?为什么我会犯这个错误? 这是我的密码:

public static  <T extends Comparable< ? super T>>
    void sort(T [] a){
    T tmp;
    for(int i=0;i<a.length;i++){
        if(a[i].compareTo(a[i+1])>0){
            tmp = a[i];
            a[i]=a[i+1];
            a[i+1]=tmp;
            sort(a);
        }
        System.out.println("i:"+i+" "+a[i]);

    }
公共静态>
无效排序(T[]a){
T-tmp;
对于(int i=0;i0){
tmp=a[i];
a[i]=a[i+1];
a[i+1]=tmp;
排序(a);
}
System.out.println(“i:+i+”+a[i]);
}
而且,即使它对数组进行排序,并且我在最后得到了错误,它仍在打印所有步骤,如何使它打印最后一个最终排序的数组? 这可能是一个简单的答案,但我的大脑现在是油炸的,不能直接思考。
提前感谢。

i
时,循环应该停止,因为在您的代码中,您访问位置
i+1
,当
i==a.length-1
时,
i+1
将尝试访问数组末端不存在的元素-因此,超出范围。

上限应为长度-1

for(int i=0;i<a.length-1;i++)

for(inti=0;i您编写了循环,这样
i
就可以得到
a.length-1
。然后您尝试访问
a[i+1]
,当
i==a.length-1
时,这是一个越界索引。请将循环的限制降低1。

试试这个

 public static void bubbleSort(Object[] source, int fromIndex, int endIndex){
            if(fromIndex==endIndex){
                return;
            }
            else{
                if(((Comparable) source[fromIndex]).compareTo(source [fromIndex+1])>0){
                    Object temp=source[fromIndex];
                    source[fromIndex]=source[fromIndex+1];
                    source[fromIndex+1]=temp;
                }
                bubbleSort(source,fromIndex+1,endIndex);
            }
            bubbleSort(source,fromIndex,endIndex-1);
        }

很好,这很有帮助。直到现在我才意识到。但是我如何修复打印?您可以在最后使用打印排序的内容。如果您只需要打印排序的数组,请在调用后在第一次调用它的位置调用从
sort()
返回的值的Arrays.toString(),而不是在
sort()中
method@fgualda87-一次执行任何操作的问题在于,您使用的是递归方法,这意味着它正在调用自身。如果您希望该方法只负责打印一次已排序的内容,则需要先调用一个外部方法,然后调用递归排序,然后打印结果。好的,是void.但是由于您正在对数组进行就地排序,您可以在调用该方法后以伪代码打印传递给该方法的数组:String[]a={};sort(a);print(a);但是如何执行print语句?@fgualda87-在循环退出后,调用
System.out.println(“i:”+(a.length-1)+“+a[a.length-1]”)
不,这没有给我任何信息。它打印出最后一个数字的索引和它的值的几倍。问题是,由于它是递归的,并且其中有一个print语句,它打印了多次,也许我应该为此创建另一篇文章。@fgualda87-另一篇文章应该是正确的方式。我没有得到你想要的你的印刷问题是,这似乎是一个不同的问题,从这篇文章的主题。