java - 冒泡排序不对单个元素进行排序

标签 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),星等 = 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 公里

我的结果输出是

  1. (36.95,-121.57),星等 = 1.00,深度 = -8660.00,标题 = 加利福尼亚州吉尔罗伊以南 6 公里
  2. (36.22,-117.89),星等 = 2.60,深度 = -1450.00,标题 = 加利福尼亚州奥兰查 ESE 12 公里
  3. (38.82,-122.77),星等 = 1.40,深度 = -1300.00,标题 = 加利福尼亚州科布以西 3 公里
  4. (35.68,-118.10),星等 = 1.50,深度 = -8280.00,标题 = 加利福尼亚州因约肯以西 27 公里
  5. (-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/

相关文章:

c - C题中的冒泡排序

java - 在 Java 中比较 2 个 XML 文档的最佳方法

ruby-on-rails - 仅显示上周创建的帖子

c++ - 类对象的选择排序数组

python - 查找数组一中最接近数组二元素的元素

c++ - 冒泡排序中的交换次数

java - 为什么我的程序在打印 letterList 数组时会跳过数字?它只打印出 A-Z 和 a-z

java - 如何知道 AudioPlayer 中是否有正在播放的文件?

java - Java 中的正则表达式非常慢

java - 启动tomcat时如何传递-D附加参数?