【问题标题】:difference between these two bubble sort implementations [duplicate]这两个冒泡排序实现之间的区别[重复]
【发布时间】:2013-11-22 02:51:55
【问题描述】:

我有两种冒泡排序的实现,但其中一种工作正常,另一种没有任何人可以解释这两者有什么区别

第一个效果很好

private static int[] sortBuble(int[] a) {
        boolean swapped = true;
        for (int i = 0; i < a.length && swapped; i++) {
            swapped = false;
            System.out.println("number of iteration" + i);

            for (int j = 1; j < a.length; j++) {

                if (a[j - 1] > a[j]) {
                    int temp = a[j - 1];
                    a[j - 1] = a[j];
                    a[j] = temp;
                    swapped = true;
                }
            }
        }

        return a;
    }

第二个不起作用,但它们看起来或多或少相同

private static int[] sortBuble1(int[] a) {
        boolean swapped = true;
        for (int i = 0; i < a.length && swapped; i++) {
            swapped = false;
            System.out.println("number of iteration" + i);

            for (int j = i + 1; j < a.length; j++) {

                if (a[i] > a[j]) {
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                    swapped = true;
                }
            }
        }

        return a;
    }

【问题讨论】:

    标签: java sorting bubble-sort


    【解决方案1】:

    区别在于数组使用的索引。

    在第一种情况下,带有j 的内部for 循环独立于i。此外,您在交换时使用 j 的相邻值,因此您始终交换数组中的相邻值。

    在第二种情况下,您的内部for 循环从i + 1 开始j。你同时使用i 和j 来索引你的数组。因此,您实际上不是在比较相邻元素,而是比较可能相距甚远的元素(例如,当i=1 和j=4 时)。那不是冒泡排序,这个算法不会那样工作。

    【讨论】:

      【解决方案2】:

      它们不一样。在第二个示例中,您为内部 for 循环的每次迭代保持 i 不变,并使用 a[i] 进行比较,这是不正确的。正如我在另一个答案中所说,第一个也是低效的。以下是第一个的优化版本:

      private static int[] bubblesort(int[] nums)
      {
          boolean done = false;
      
          for (int i = 0;  i < nums.length && !done; i++)
          {
              done = true;
      
              for (int j = nums.length-1; j > i; j--)
              {
                  if (nums[j] < nums[j-1])
                  {
                      int temp = nums[j];
                      nums[j] = nums[j-1];
                      nums[j-1] = temp;
                      done = false;
                  }
              }
          }
      
          return nums;
      }
      

      在第 ith 次迭代结束时,我们知道前 i 个元素已排序,因此我们不再需要查看它们。我们需要布尔值来确定是否需要继续。如果没有进行交换,那么我们就完成了。我们可以删除布尔值,它仍然可以工作,但效率会降低。

      【讨论】:

      • 你怎么知道前i个元素是排序的?你所做的只是颠倒循环的顺序。例如它会在这个[1 2 3 4 5 6 7 8 9 0]上工作吗? 0如何到达第一个元素?
      • @over_optimistic 如果我们从链表的末尾开始,每次都交换nums[j] &gt; nums[j-1],那么最小的元素必须在迭代结束时的开头,所以我们可以跳过那个元素下一次迭代。这概括为上面的代码。
      • 对不起,我的意思是nums[j] &lt; nums[j-1]。
      猜你喜欢
      • 2014-02-12
      • 2012-11-17
      • 2017-03-11
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多