【问题标题】:shorten bubble sort loop缩短冒泡排序循环
【发布时间】:2018-10-25 06:59:19
【问题描述】:

我已经改变了我的冒泡排序,从实现应用程序在排序的每个步骤中遍历整个列表。

这不是必需的,因为在第一次遍历后,最小的项目将位于列表的末尾,而在第二次遍历后,第二小的项目将位于正确的位置(倒数第二个),依此类推。我有点不确定到底需要改变什么。

我需要修改冒泡排序,使其不会执行不必​​要的比较。

   private void bubbleSort() {
      int currentCount = 0;
      showStatus("Sorting ...");
      boolean swap = true;
      while (swap) {
         swap = false;
         for (int i = 0; i < items.length - 1; i++) {
            if (greaterThan(items[i], items[i + 1])) {
               swapItems(items[i], items[i + 1]);
               swap = true;
               currentCount++;
            }
         } // for
      } // while
      showStatus("Sort complete, number of swaps = " + currentCount);
   } // bubbleSort   private void bubbleSort() {

【问题讨论】:

  • 请删除不必要的代码

标签: java sorting bubble-sort


【解决方案1】:

冒泡排序会执行不必​​要的比较,这就是为什么您不要在生产中将它用于任何合理大小的数据集。特别是关于您的代码。简单看一下Rosettacode 上的参考实现(因为我不想再写一遍,你只在学校这样做)看起来它做了完全相同数量的比较。如果你想要一个足够大的 N 的真正好的排序算法,请尝试合并排序。

参考

public static <E extends Comparable<? super E>> void bubbleSort(E[] comparable) {
    boolean changed = false;
    do {
        changed = false;
        for (int a = 0; a < comparable.length - 1; a++) {
            if (comparable[a].compareTo(comparable[a + 1]) > 0) {
                E tmp = comparable[a];
                comparable[a] = comparable[a + 1];
                comparable[a + 1] = tmp;
                changed = true;
            }
        }
    } while (changed);
}

【讨论】:

    【解决方案2】:

    首先,在 for 循环的第一次迭代结束时,最大的元素将位于数组的末尾,而不是最小的。

    如果你想修改你的代码来保存不需要的比较,你可以检查最后一个比较并使用 if 作为下一个 for 循环的结束。

    考虑以下代码:(我希望 java 允许 while(int) - 我不是 java 专家...)

    integer swap = items.length - 1;
    while (swap) {
        swap = 0;
        integer lastSwap = swap ;
        for (int i = 0; i < lastSwap ; i++) {
            if (greaterThan(items[i], items[i + 1])) {
               swapItems(items[i], items[i + 1]);
               swap = i;
               currentCount++;
            }
         } // for
      } // while
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 2021-01-29
      • 2017-01-25
      • 2020-05-30
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多