我有两个方法,它们必须是 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);
}
}
原始数据为
- (-23.27,-67.66),星等 = 4.80,深度 = -175320.00,标题 = 智利圣佩德罗德阿塔卡马东南 69 公里
- (35.68,-118.10),星等 = 1.50,深度 = -8280.00,标题 = 加利福尼亚州因约肯以西 27 公里
- (36.22,-117.89),星等 = 2.60,深度 = -1450.00,标题 = 加利福尼亚州奥兰查 ESE 12 公里
- (36.95,-121.57),星等 = 1.00,深度 = -8660.00,标题 = 加利福尼亚州吉尔罗伊以南 6 公里
- (38.82,-122.77),星等 = 1.40,深度 = -1300.00,标题 = 加利福尼亚州科布以西 3 公里
我的结果输出是
- (36.95,-121.57),星等 = 1.00,深度 = -8660.00,标题 = 加利福尼亚州吉尔罗伊以南 6 公里
- (36.22,-117.89),星等 = 2.60,深度 = -1450.00,标题 = 加利福尼亚州奥兰查 ESE 12 公里
- (38.82,-122.77),星等 = 1.40,深度 = -1300.00,标题 = 加利福尼亚州科布以西 3 公里
- (35.68,-118.10),星等 = 1.50,深度 = -8280.00,标题 = 加利福尼亚州因约肯以西 27 公里
- (-23.27,-67.66),星等 = 4.80,深度 = -175320.00,标题 = 智利圣佩德罗德阿塔卡马东南 69 公里
我的猜测是我必须从 onepassbubblesort 返回列表,并再次运行该列表,但我不能使用 void 方法来完成
最佳答案
您的排序方法仅在存在匹配时移动 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;
关于java - 冒泡排序不对单个元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34806762/