缩短气泡排序循环

时间:2018-10-25 06:59:20

标签: java sorting bubble-sort

我已经更改了气泡排序方式,因为在排序的每个步骤中实现应用程序都会遍历整个列表。

这不是必需的,因为在第一次遍历之后,最小的项将位于列表的末尾,而在第二次遍历之后,第二个最小的项将处于其正确位置(倒数第二),依此类推。我不确定到底需要哪些更改。

我需要修改冒泡排序,以免执行不必要的比较。

   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() {

2 个答案:

答案 0 :(得分:0)

气泡排序将执行不必要的比较,这就是为什么您不对任何合理大小的数据集在生产中使用气泡排序的原因。特别是关于您的代码。简单查看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);
}

答案 1 :(得分:0)

首先,在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