Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Riddle:找出这个冒泡排序实现中的严重错误_Java_Sorting_Bubble Sort - Fatal编程技术网

Java Riddle:找出这个冒泡排序实现中的严重错误

Java Riddle:找出这个冒泡排序实现中的严重错误,java,sorting,bubble-sort,Java,Sorting,Bubble Sort,(不,这不是家庭作业,我只是发现了bug,并认为在这里分享可能会有用) import java.util.List; 公共类气泡排序器{ 公共无效排序(列表){ while(true){ 布尔didWork=false; 对于(int i=0;i0){ 交换(列表,i,i+1); 干活儿=真; 打破 } } 如果(!didWork) 回来 } } 专用静态无效交换(列表,int i,int j){ T tmp=list.get(i); list.set(i,list.get(j)); 列表集(j

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

import java.util.List;
公共类气泡排序器{
公共无效排序(列表){
while(true){
布尔didWork=false;
对于(int i=0;i0){
交换(列表,i,i+1);
干活儿=真;
打破
}
}
如果(!didWork)
回来
}
}
专用静态无效交换(列表,int i,int j){
T tmp=list.get(i);
list.set(i,list.get(j));
列表集(j,tmp);
}
}

交换
应该是设置j,而不是i+1。

严格意义上不是bug,而是执行
中断当你发现反转时,你的排序
O(n^3)
很复杂,这是不可取的<代码>中断
可以删除。

在这种情况下不是真正的错误,因为j总是等于i+1。这只是重构代码时遗漏的一点。这里隐藏了一个更严重的错误。不过还是要感谢您的发现-编辑问题以删除此错误。!!哦,对了:-)这是swap函数中的一个bug,但不是sort函数…为什么投票关闭?您希望我将标题改为“此实现中的严重错误是什么?”吗?我觉得很好。这一定是个大错误。@Nikita-如果你想得到提示,请告诉我。@ripper234这是algo中的一个真正的错误,还是列表不可修改,并且
set
方法不起作用?@ripper:投票关闭是因为这不是一个代码审查网站。我们不会为您调试代码。您向我们展示您为发现问题所做的工作,我们可以帮助解决您遇到的任何具体问题。你需要告诉我们为什么你认为首先有一个bug,这就是我的意思。我刚刚编写了这段代码,作为编写快速排序实现和验证单元测试工作的热身。然后我开始对中等大小的列表进行排序,看到代码花了很长时间对它们进行排序……是的,这不是一个真正的错误,而是一个严重的低效。(不管怎样,正确完成冒泡排序并不是那么有效,但这只是CPU周期过剩。)我注意到了“bug”,但一直盯着代码,认为应该有一个bug会破坏排序-D
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);
    }
}