我有两个必须是void方法的方法,它们使用名为Magnitude的列表中的元素进行排序,使用从最小到最大的冒泡排序对它们进行排序,方法OnePassBubbleSort一次排序一个元素 和sortByMagnitudeWithBubbleSort运行排序所需的时间来得到答案问题是2.6级的地震似乎没有正确排序。
我的代码是 this:
public void onePassBubbleSort(ArrayList<QuakeEntry> quakes, int numSorted) {
int minIdx = 0;
for (int i=0 + 1; i< quakes.size()-numSorted; i++) {
if (quakes.get(i).getMagnitude() < quakes.get(minIdx).getMagnitude()) {
QuakeEntry qi = quakes.get(i);
QuakeEntry qmin = quakes.get(minIdx);
quakes.set(i,qmin);
quakes.set(minIdx,qi);
minIdx = i;
}
}
System.out.println("Printing Quakes after pass " + numSorted );
for(QuakeEntry qe: quakes){
System.out.println(qe.toString());
}
}
public void sortByMagnitudeWithBubbleSort(ArrayList<QuakeEntry> in) {
for (int i=0; i< in.size()-1; i++) {
onePassBubbleSort(in,i);
}
}
原始数据是
我的结果输出是
我的猜测是我必须从onepassbubblesort返回列表,并再次运行该列表,但我无法用void方法完成
答案 0 :(得分:0)
您的排序方法仅在匹配时移动minIdx = i;
指针,如果第一个元素较小,则不会排列。实际上,您只是交换第一个元素和匹配时遇到的任何其他元素。
对此的修复是将minIdx = i;
移到if语句之外,以便始终调用它:
for (int i=0 + 1; i< quakes.size()-numSorted; i++) {
if (quakes.get(i).getMagnitude() < quakes.get(minIdx).getMagnitude()) {
QuakeEntry qi = quakes.get(i);
QuakeEntry qmin = quakes.get(minIdx);
quakes.set(i,qmin);
quakes.set(minIdx,qi);
}
minIdx = i;
}
因为您编码的方式可以接受numSorted
参数,所以问题的另一个解决方案是为此变量赋值minIdx
:
minIdx = numSorted;