首页 > 解决方案 > 我的检查算法不会停止冒泡排序

问题描述

我有一个包含 25 个大小值的文件。我检查了我的冒泡排序算法是否管理了 19 或 20 个循环。我的检查方法不会停止算法,它需要编写 24 个循环。我不明白,我做错了什么。它是 zip 文件,您可以在其中找到数据文件夹和 nov20quakedatasmall.atom fid 进行测试

import java.util.*;
import edu.duke.*;

公共类 QuakeSortInPlace {

public boolean checkInSortedOrder (ArrayList<QuakeEntry> quakes) {
    boolean stat = true;
    for (int i = 0; i< quakes.size()-1; i++) {
        double fParametr = quakes.get(i).getMagnitude();
        double sParametr = quakes.get(i+1).getMagnitude();
        if (fParametr < sParametr) {
            stat = true;
        }
        else {
            stat = false;
            break;
        }
    }
    return stat;
}

public void onePassBubbleSort (ArrayList <QuakeEntry> quakeData, int numSorted) {
    int loops = 0;
    //boolean isSorted = true;
   
        for (int i = 0; i<numSorted; i++) {
            //isSorted = true;
            for (int k = 0; k<quakeData.size()-i-1; k++) {
                double firstCompElement = quakeData.get(k).getMagnitude();
                double secondCompElement = quakeData.get(k+1).getMagnitude();
                if (firstCompElement > secondCompElement) {
                    QuakeEntry first = quakeData.get(k);
                    QuakeEntry second = quakeData.get(k+1);
                    quakeData.set(k+1 ,first);
                    quakeData.set(k,second);
                    // isSorted = false;
                }
                
            }
            loops++;
            
            if (checkInSortedOrder(quakeData)) {
                break;
            }
            // if (isSorted) {
               // break;
            // }          
    }
    System.out.print("We needed: "+loops);

}

public void sortByMagnitudeWithBubbleSortWithCheck (ArrayList<QuakeEntry> in) {
    int numOfElements = in.size();
    int finalNumOfElements = numOfElements-1;
    onePassBubbleSort (in, finalNumOfElements);
    
}

public void testSort() {
    EarthQuakeParser parser = new EarthQuakeParser(); 
    String source = "data/nov20quakedatasmall.atom";
    ArrayList<QuakeEntry> list  = parser.read(source); 
    System.out.println("read data for "+list.size()+" quakes");    
    sortByMagnitudeWithBubbleSortWithCheck(list);
    for (QuakeEntry qe: list) { 
         System.out.println(qe);
    } 
    
}

}

标签: javabubble-sort

解决方案


源文件中有两个具有相同值的条目。这会触发 if 语句中的“else”并导致程序继续下一个循环。

if (fParametr < sParametr) {
            stat = true;
        }
        else {
            stat = false;
            break;
        } 

更改(fParametr < sParametr)(fParametr <= sParametr)应该可以解决问题。


推荐阅读