冒泡排序不排序一个元素

时间:2016-01-15 08:14:12

标签: java sorting bubble-sort

我有两个必须是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),mag = 4.80,深度= -175320.00,标题= 69km SE of San Pedro de Atacama,Chile
  • (35.68,-118.10),mag = 1.50,深度= -8280.00,标题= 27km W of Inyokern,California
  • (36.22,-117.89),mag = 2.60,深度= -1450.00,标题= 12km ESE of Olancha,California
  • (36.95,-121.57),mag = 1.00,深度= -8660.00,标题= 6km S of Gilroy,California
  • (38.82,-122.77),mag = 1.40,深度= -1300.00,标题= 3km W of Cobb,California

我的结果输出是

  1. (36.95,-121.57),mag = 1.00,深度= -8660.00,标题= 6km S of Gilroy,California
  2. (36.22,-117.89),mag = 2.60,深度= -1450.00,标题= 12km ESE of Olancha,California
  3. (38.82,-122.77),mag = 1.40,深度= -1300.00,标题= 3km W of Cobb,California
  4. (35.68,-118.10),mag = 1.50,深度= -8280.00,标题= 27km W of Inyokern,California
  5. ( - 23.27,-67.66),mag = 4.80,深度= -175320.00,标题= 69km SE of San Pedro de Atacama,Chile
  6. 我的猜测是我必须从onepassbubblesort返回列表,并再次运行该列表,但我无法用void方法完成

1 个答案:

答案 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;