【问题标题】:Riddle: Spot the serious bug in this bubble sort implementation谜语:找出这个冒泡排序实现中的严重错误
【发布时间】:2011-06-02 02:59:01
【问题描述】:

(不,这不是家庭作业,我只是发现了错误并认为在这里分享它可能有用)

import java.util.List;

public class BubbleSorter {

    public <T extends Comparable<T>> void sort(List<T> list) {
        while (true) {
            boolean didWork = false;
            for (int i = 0; i < list.size() - 1; ++i) {
                if (list.get(i).compareTo(list.get(i + 1)) > 0) {
                    swap(list, i, i + 1);
                    didWork = true;
                    break;
                }
            }

            if (!didWork)
                return;
        }
    }

    private static <T> void swap(List<T> list, int i, int j) {
        T tmp = list.get(i);
        list.set(i, list.get(j));
        list.set(j, tmp);
    }
}

【问题讨论】:

  • 为什么要关闭投票?您是否希望我将标题编辑为“此实现中的严重错误是什么?”而是?
  • 对我来说看起来不错。那一定是个大坏蛋。
  • @Nikita - 如果需要提示,请联系我。
  • @ripper234 这是算法中的一个真正的错误,还是列表不可修改并且set 方法不起作用?
  • @ripper:投票结束是因为这不是一个代码审查网站。我们不会为您调试代码。您向我们展示了您为找到问题所做的工作,我们可以帮助您解决遇到的任何具体问题。您首先需要告诉我们您为什么认为存在错误。

标签: java sorting bubble-sort


【解决方案1】:

从最严格的意义上讲,这不是一个错误,但是当您发现反转时执行break; 会使您的排序O(n^3) 变得复杂,这几乎是不可取的。 break 可以直接删除。

【讨论】:

  • 这就是我的意思。我刚刚编写了这段代码作为编写快速排序实现和验证我的单元测试工作的热身。然后我开始对中等大小的列表进行排序,发现代码要花很长时间才能对它们进行排序......
  • 是的,不是真正的错误,而是严重的低效率。 (并不是说冒泡排序在正确完成时效率很高,但这只是 CPU 周期的贪婪。)我注意到“错误”但继续盯着代码认为应该有一个错误会破坏排序. :-D
【解决方案2】:

swap 应该设置为 j,而不是 i+1。

【讨论】:

  • 不是真正的错误在这种情况下,因为 j 总是等于 i+1。这只是重构代码时遗漏的东西。这里隐藏着一个更严重的错误。
  • 但还是感谢您发现 - 编辑问题以删除它。
  • !!哦,对 :-) 这是交换函数中的一个错误,但不是排序函数...
猜你喜欢
  • 2019-12-14
  • 2017-03-11
  • 2012-07-23
  • 2016-01-19
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多