【问题标题】:Recursive Bubble Sort in JavaJava中的递归冒泡排序
【发布时间】:2011-12-09 12:42:35
【问题描述】:

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

    }

另外,即使它对数组进行排序并且最后我得到错误,它正在打印所有步骤,我如何让它打印最后一个最终排序的数组? 可能是一个简单的答案,但我的大脑现在被炸了,无法思考。 提前致谢。

【问题讨论】:

    标签: java arrays sorting recursion bubble-sort


    【解决方案1】:

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

    【讨论】:

    • 完美,有帮助。直到现在才意识到。我该如何修复打印?
    • 您可以使用Arrays.toString()在最后打印排序后的内容。
    • 如果你只需要打印排序后的数组,在你调用它的地方调用sort()之后返回的值调用Arrays.toString()第一次 - 不在 sort() 方法中
    • @fgualda87 - 一次做任何事情的问题是您使用的是递归方法,这意味着它正在调用自己。如果您希望该方法只负责打印一次排序的内容,则需要一个首先调用的外部方法,然后调用递归排序,然后打印结果。
    • 好的,它是无效的。但是由于您正在对数组进行排序,因此您可以在调用该方法后打印您传递给该方法的数组,伪代码为: String[] a = {};排序(一);打印(一);
    【解决方案2】:

    上限应该是length-1

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

    【讨论】:

      【解决方案3】:

      您已经编写了循环,以便ia.length - 1 一样位。然后你尝试访问a[i+1],这是i == a.length - 1 时的越界索引。将循环的限制降低 1。

      【讨论】:

      • 你会如何做打印语句?
      • @fgualda87 - 循环退出后,调用System.out.println("i:"+(a.length-1)+" "+a[a.length-1]);
      • 不,这并没有给我任何东西。它会多次打印最后一个数字的索引和它的值。问题是,由于它是递归的,并且其中有一个打印语句,它会打印多次,也许我应该为此创建另一个帖子。
      • @fgualda87 - 另一个帖子将是正确的方法。我不明白你的打印问题是什么,这似乎与这篇文章的主题不同。
      【解决方案4】:

      试试这个。

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

      【讨论】:

        猜你喜欢
        • 2012-05-28
        • 1970-01-01
        • 2013-10-09
        • 2013-11-29
        • 1970-01-01
        • 2021-06-22
        • 2013-12-02
        • 2023-03-24
        • 2021-03-24
        相关资源
        最近更新 更多