【问题标题】:Trouble bubble sorting (recursion) an array of integers in Java麻烦冒泡排序(递归)Java中的整数数组
【发布时间】:2013-08-06 01:03:33
【问题描述】:

尝试实现递归方法对整数数组进行排序:

    public static void bubbleSort(int[] arr, int n){

      int index = n-1;

      System.out.println("Round number: " + n);
      System.out.println(Arrays.toString(arr));

      while(index>=1)
      {
          if(arr[index] <  arr[index-1])
              swap(arr, index, index-1);


          index--;
      }
      if(n>1)
          bubbleSort(arr, n-1);
  }

}

前几轮似乎工作正常,将集合中的最小整数移到前面,但它只是在中途停止工作。知道为什么吗?谢谢!

【问题讨论】:

  • 停止工作,意味着?程序是否崩溃,输出不正确的值或抛出异常? stop working 是通用的
  • @Sello 这意味着他在一个小的测试集上尝试过它并且它有效,当他在一个更大/更复杂的测试集上尝试它时它没有完成排序(输出是一个未排序的数组)

标签: java arrays sorting recursion


【解决方案1】:

您的算法每次都将最小值移动到数组的开头,然后在后续调用中忽略最后一个元素。不幸的是,不能保证最后一个元素是最大的。

修复它的一种方法可能是将index 初始化为arr.length - 1,并在index &gt; arr.length - n 时继续循环。

【讨论】:

  • @alfasin - 我发布了所需的更改。我通过从问题中获取代码,进行更改并且仅在我的答案中给出的更改并运行它来进行测试。你还需要知道什么?
  • 我测试了您的答案(使用问题中的代码),但它对我不起作用。也许我没有正确实施它是不好的 - 但话又说回来 - 如果我可能弄错了 - 任何人都可以......你为什么不发布你的代码,以免造成混淆?
  • @sje397 如果我明确要求它显然对我来说既不是多余的也不是无用的。我仍然认为你的答案是错误的,但如果你能证明我错了,我会很高兴(当然,我会取消反对 + 赞成你的答案)。
  • @alfasin 这一点都不明显。人们总是认为他们不需要东西。你可以想你喜欢的。
  • “人们认为他们需要东西”——你现在是在把哲学扯到我身上吗? :))) 如果你是对的,你会用 4-5 行代码更新你的答案,这会证明我错了,所以要么你懒得这样做,要么你只是错了而不承认 - 这两个选项都是不是很有尊严,但就像你暗示的那样——你不欠我任何东西。祝你好运!
【解决方案2】:

试试这个:

import java.util.*;

public class Test{
    public static void main(String[] args){
        int[] ttt = {9,8,7,6,5,4,3,2,1};

        bubbleSort(ttt, ttt.length);
    }

    public static void bubbleSort(int[] arr, int n){
        int index = 0;

        System.out.println("Round number: " + n);
        System.out.println(Arrays.toString(arr));

        while(index < n - 1){
            if(arr[index] >  arr[index + 1]){
                swap(arr, index, index + 1);
            }
            index++;
        }

        if(n > 1){
            bubbleSort(arr, n-1);
        }
    }

    public static void swap(int[] arr, int i, int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

在每一轮的情况下,你保证在每一轮结束时你都会将最小的数字推到它的位置,但随后会省略数组的最后一个元素,这不一定是最大的数字。您应该以相反的顺序进行,将最大的数字推到它的位置,然后在下一轮中将其排除在外。

http://en.wikipedia.org/wiki/File:Bubble-sort-example-300px.gif

仅供参考:冒泡排序最差情况下的性能是 O(n^2),也许您想实现更好的排序算法,如快速排序或归并排序?

【讨论】:

  • 我觉得你的回答比我的好,加分指出冒泡排序的低效率。
  • 谢谢!在那之后我得到了它的工作。我理解冒泡排序的低效率,但这是为了练习!现在正在尝试快速/合并排序。
【解决方案3】:

if 条件更改为:

...
if(arr[index] <  arr[index-1]){
   swap(arr, index, index-1);
   index = n;
}
index--;
...

问题在于,在您找到要“委托”整个阵列的阵列成员后 - 您需要“重新启动”,因为可能还有其他成员需要“重新考虑”。 如果我的描述不够清楚,请使用调试器运行,看看我的意思。

完整解决方案:

import java.util.Arrays;

/**
 * User: alfasin
 * Date: 8/5/13
 */
public class BubbleSort {

    public static void bubbleSort(int[] arr, int n){

        int index = n-1;

        System.out.println("Round number: " + n);
        System.out.println(Arrays.toString(arr));

        while(index>=1)
        {
            if(arr[index] <  arr[index-1]){
                swap(arr, index, index-1);
                index = n;
            }
            index--;
        }
        if(n>1)
            bubbleSort(arr, n-1);
    }

    private static void swap(int[] arr, int index, int i) {
        arr[i] = arr[i] ^ arr[index];
        arr[index] = arr[i] ^ arr[index];
        arr[i] = arr[i] ^ arr[index];
    }

    public static void main(String...args){
        int[] arr = {4,2,9,6,2,8,1};
        bubbleSort(arr, arr.length);
        for(int i=0; i<arr.length; i++){
            System.out.print(arr[i]+" ");
        }
    }

}

就像 sjee397 建议的那样 - 这更像是冒泡排序的“版本”...

更“保守”的冒泡排序:

public static void bubbleSort(int[] arr, int n){
        boolean swapped= true;
        while (swapped){
            swapped = false;
            for(int i=0; i<arr.length-1; i++){
                if(arr[i]>arr[i+1]){
                    swap(arr,i,i+1);
                    swapped = true;
                }
            }
        }
    }

【讨论】:

  • 你还是做的太多了。在正常的冒泡排序中,每次迭代都会将一个元素放在正确的位置(在 OP 中,它是第一个元素,而在您的“保守”版本中,它是最后一个元素)。因此,每次排序迭代,您都可以将您在列表中查看的项目数减少一个。您仍然每次都在迭代整个数组。在您的版本中,您可以为 while 循环的调用次数添加一个计数器,例如 n,并将您的 for 循环条件更改为 i &lt; arr.length - n - 1
  • @sje397 现在,如果我理解正确的话——那将是冒泡排序的优化版本——而不是“保守”版本——至少根据维基:en.wikipedia.org/wiki/Bubble_sort#Pseudocode_implementation
  • 顺便说一句,我认为你需要做i &lt; arr.length - n + 1 - 因为你必须重复直到最后一个“交换”项目的位置包括在内 - 因为在同一个地方现在可能有另一个项目应该交换。
  • 你说得对,它们都是冒泡排序。一开始我没有认识到你的第一个 sn-p 是不太理想的冒泡排序,我应该知道,但我并不是要暗示非最佳版本不是冒泡排序。
  • 您不希望 +1 - 当n = 0 时,这会使您的索引超出范围。
猜你喜欢
  • 2011-12-09
  • 2012-05-28
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多