【问题标题】:Java Bubble Sort Acting StrangeJava 冒泡排序行为奇怪
【发布时间】:2016-06-09 02:13:39
【问题描述】:

我在这里有一个使用 Java 进行冒泡排序的函数,这段代码确实可以对数组进行排序。但是,问题是我不知道它是如何排序的,因为它看起来不像标准的冒泡排序。

public static void swap (int [ ] data, int index1, int index2)
// POST: elements at indexes are exchanged
{   int temp = data[index1];                                // temporary to hold first value
    data[index1] = data[index2];
    data[index2] = temp;
}

public static void bubbleSort (int [ ] data)
// POST: elements in data array are sorted in ascending order
{   for (int ct1=0; ct1<data.length-1; ct1++)           // outer loop moves one element into place
    {   for (int ct2=0; ct2<data.length-1-ct1; ct2++)
            if (data[ct2] > data[ct2+1])                    // swap if element on left bigger than right
                swap (data, ct2,ct2+1);
        for (int i = 0; i < data.length; i++) System.out.print(data[i] + " ");
        System.out.println();
    }
}

我理解的冒泡排序将采用数组 {40, 90, 10, 60, 20} 并比较第 0 和第 1 个索引。如果第 0 个索引大于第 1 个索引,那么它们将交换。然后,在这种情况下,40 和 90 将保持原位,然后将比较第一个和第二个索引,导致 90 和 10 交换。这将持续 n - 1 次,其中 n 是数组的长度。

问题是,使用这个函数似乎给出了输出:

Bubble sort:
Starting array: 40 90 10 60 20 
40 10 60 20 90 
10 40 20 60 90 
10 20 40 60 90 
10 20 40 60 90

有人可以帮忙解释一下吗?

它似乎在比较任意值,并没有像应有的那样检查 40 和 90。

【问题讨论】:

  • 看起来不像是在随意比较。它正在做代码所做的事情。从字面上看,它将较大的值“冒泡”到数组的末尾。在您的第一个内部循环中,设置一个 System.out.println-- 这可能有助于您澄清它。
  • 行为符合您的理解。您正在创建的输出是在处理每一行之后而不是在每次交换之后。你应该使用更多的大括号。
  • 正是我要找的凯文。如果您发布答案,我会接受。

标签: java arrays sorting bubble-sort


【解决方案1】:

在您的 bubbleSort 方法中,您从 0 开始一个数组,直到数组的长度 - 1。相反,只需简单地执行它,然后像这样反向运行它:

public static void bubbleSort(int [] data) {
    int k;
    for (int m = data.length; m >= 0; m--) {
        for (int i = 0; i < data.length - 1; i++) {
            k = i + 1;
            if (array[i] > array[k]) {
                swapNumbers(i, k, array);
            }
        }
      // Time to test this new array here:
    for (int i = 0; i < data.length; i++) {
        System.out.print(data[i] + ", ");
    }
        System.out.println("\n");           
    }
}

检查您的解决方案是否打印正确并告诉我

【讨论】:

    【解决方案2】:

    它将与 ct2 在一个循环中交换直到结束。 内循环,将进行 4 次。

    这就像一块石头落入水中。

    英语很差,对不起~

    【讨论】:

      【解决方案3】:

      您的冒泡排序也按照您预期的方式运行。 它以相反的顺序从低到高排序(即最后一列首先设置)

      我认为您遇到的问题是输出采样频率 与您的想法不符。

      如果你稍微修改一下代码

      public static void swap (int [ ] data, int index1, int index2){
          int temp = data[index1];
          data[index1] = data[index2];
          data[index2] = temp;
      }
      
      public static void bubbleSort (int [ ] data) {
          for (int ct1=0; ct1<data.length-1; ct1++) {
              for (int ct2=0; ct2<data.length-1-ct1; ct2++) {
                  if (data[ct2] > data[ct2 + 1]) {
                      swap(data, ct2, ct2 + 1);
                  // non functional change to move sampling point
                      for (int i = 0; i < data.length; i++) {
                           System.out.print(data[i] + " ");
                      }
                      System.out.println();
                  }
              }
          }
      }
      
      public static void main(String[] args) {
          bubbleSort(new int[]{40,90,10,60,20});
      }
      

      这会产生输出

      40 10 90 60 20 
      40 10 60 90 20 
      40 10 60 20 90 
      10 40 60 20 90 
      10 40 20 60 90 
      10 20 40 60 90 
      

      这是我认为你希望看到的。

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-25
        • 2017-06-17
        • 2015-09-12
        • 2021-06-29
        • 2013-09-04
        相关资源
        最近更新 更多