冒泡排序不排序一个元素

Bubble Sort not Sorting One Element

我有两个必须是 void 方法的方法,它们使用名为 Magnitude 的列表中元素的属性使用冒泡排序从最小到最大对它们进行排序,OnePassBubbleSort 方法一次对一个元素排序 和 sortByMagnitudeWithBubbleSort 运行s 排序获得答案所需的时间问题是 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);   
    } 
}

原始数据为

我的结果输出是

  1. (36.95, -121.57), mag = 1.00, depth = -8660.00, title = 6km S of Gilroy, California
  2. (36.22, -117.89), mag = 2.60, depth = -1450.00, title = 12km ESE of Olancha, California
  3. (38.82, -122.77), mag = 1.40, depth = -1300.00, title = 3km W of Cobb, California
  4. (35.68, -118.10), mag = 1.50, depth = -8280.00, title = 27km W of Inyokern, California
  5. (-23.27, -67.66),星等 = 4.80,深度 = -175320.00,标题 = 智利圣佩德罗德阿塔卡马东南 69 公里

我的猜测是我必须 return 来自 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;