Java Riddle:找出这个冒泡排序实现中的严重错误
(不,这不是家庭作业,我只是发现了bug,并认为在这里分享可能会有用)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
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);
}
}