Java中的递归冒泡排序

3

我正在尝试用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]);

    }

此外,尽管它对数组进行了排序并在最后出现错误,但它仍会打印所有步骤,如何使其打印最终排序后的数组? 可能是一个简单的答案,但我的大脑现在已经崩溃了,不能正常思考。 提前致谢。

4个回答

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

好的,我确实是这样写的,但它会打印出几次。有什么解决办法吗? - randomizertech
1
如果您只需要打印已排序的数组,请在第一次调用sort()方法时,在调用它的位置上调用Arrays.toString(),并将其作为sort()方法返回的值。不要在sort()方法内部调用Arrays.toString() - Óscar López
好的,排序是void类型,因此不返回任何内容。我只在测试该方法的驱动程序中调用它。想法是在方法内部以某种方式打印它。 - randomizertech
1
@fgualda87 - 做任何事情一次的问题在于你正在使用递归方法,这意味着它会调用自身。如果你想让该方法负责仅打印排序后的内容一次,你需要一个外部方法首先被调用,然后调用递归排序,并在之后打印结果。 - Paul Bellora
1
好的,它是 void。但由于你正在就地对数组进行排序,在调用方法后,你可以打印传递给该方法的数组,伪代码如下:String[] a = {}; sort(a); print(a); - Óscar López
显示剩余6条评论

5
您已经编写了循环,以便使i达到a.length - 1的值。然后您尝试访问a[i+1],当i == a.length - 1时,这是一个越界的索引。请将循环的限制减小1个单位。

你会如何执行打印语句呢? - randomizertech
@fgualda87 - 循环结束后,调用 System.out.println("i:"+(a.length-1)+" "+a[a.length-1]); - Ted Hopp
不,这并没有给我任何东西。它会打印出最后一个数字的索引和值几次。问题在于它是递归的,并且有一个打印语句,所以它会多次打印,也许我应该为此创建另一个帖子。 - randomizertech
1
@fgualda87 - 另一篇帖子可能是正确的方式。我不明白你的打印问题是什么,而且它似乎与这篇帖子的主题不同。 - Ted Hopp

2
上限应该是长度减1。
for(int i=0;i<a.length-1;i++)

-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);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接