java - 如何修复我的合并排序?

标签 java arraylist mergesort

当我编译合并排序时,它会编译罚款,但没有输出。

这需要递归地完成。另外,我确实在主函数中运行了 printList() 函数,所以并不是我忘记打印列表。过去 30 分钟我一直盯着这个。

public void printList(){
    for(int i = 0; i <  fullNames.size(); i++){
        System.out.println(fullNames.get(i));
    }
}

public void sort(){
    fullNames = mergeSort(fullNames);
}

public ArrayList<String> extract(ArrayList<String> ex, int low, int high){
    ArrayList<String> answer = new ArrayList<String>();
    for(int i = low; i <= high; i++){
        answer.add(ex.get(i));
    }

    return answer;
}

public ArrayList<String> merge(ArrayList<String> first, ArrayList<String> second){
    int f = 0; 
    int s = 0;
    ArrayList<String> answer = new ArrayList<String>();
    while(first.size() > 0 || second.size() > 0){
        if(s != second.size() && f != first.size()){
            if(first.get(f).compareTo(second.get(s)) > 0){
                answer.add(second.get(s));
                s++;
            }

            else if(first.get(f).compareTo(second.get(s)) < 0){
                answer.add(first.get(f));
                f++;
            }
        }

        else if(f == first.size()){
            while(s != second.size()){
                answer.add(second.get(s));
                s++;
            }
        }

        else{
            while(f != first.size()){
                answer.add(first.get(f));
                f++;
            }
        }
    }

    return answer;
}
public ArrayList<String> mergeSort(ArrayList<String> names){
    int k = names.size()-1;

    if(k > 1){
        ArrayList<String> first = extract(names, 0, k / 2);
        ArrayList<String> second = extract(names, (k / 2) + 1, k);

        mergeSort(first);
        mergeSort(second);

        return merge(first, second);
    }

    else{
        return names;
    }
}

最佳答案

合并中的 while 条件永远不会为 false,因为第一个和第二个的大小永远不会在循环内调整:

while(first.size() > 0 || second.size() > 0){
        if(s != second.size() && f != first.size()){
            if(first.get(f).compareTo(second.get(s)) > 0){
                answer.add(second.get(s));
                s++;
            }

            else if(first.get(f).compareTo(second.get(s)) < 0){
                answer.add(first.get(f));
                f++;
            }
        }

        else if(f == first.size()){
            while(s != second.size()){
                answer.add(second.get(s));
                s++;
            }
        }

        else{
            while(f != first.size()){
                answer.add(first.get(f));
                f++;
            }
        }
    }

关于java - 如何修复我的合并排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36431977/

相关文章:

java - SimpleDateFormat ("dd-MMM-YYYY") 提前一年打印年份

java - 我在 HashMap 中使用 HashMap,但我也需要使用 ArrayList 作为值。我无法提供值(value)

android - 字符串的 Arraylist 到一个逗号分隔的字符串

java - 如何修复合并排序方法的 ArrayIndexOutOfBoundsException?

java - 从没有客户端的输入流读取数据 "flush()"

java - 同一类算法中的不同原始数据类型条目

c - 在 C 中进行合并排序时不断获取垃圾值

c - 如何在 C 中合并和排序两个双向链表

java - 为什么即使元素未插入到 Firestore 文档中的数组中,也会调用 successListener?

Python 数组,试图将文本文件放入数组中