java - 合并排序程序没有给出正确的结果?

标签 java algorithm data-structures mergesort

我正在编写一个合并排序程序,但没有给出正确的结果,而且它没有将我的列表分成两个相等的部分,请看下面我的程序:

import java.util.Arrays;

public class MyProgram {
    public static void main(String[] args){

        int[] list = {64, 7, 52, 68, 19, 10, 11, 14, 17, 18, 19};

        System.out.println("\t**AFTER SPLITING**");
        System.out.println("Left List: "+Arrays.toString(leftList(list)));
        System.out.println("Right List: "+Arrays.toString(rightList(list)));

        System.out.println("\n\n\t**BEFORE MERGE SORT**");
        System.out.println(Arrays.toString(list));

        mergeSort(list);

        System.out.println("\t**AFTER MERGE SORT**");
        System.out.println(Arrays.toString(list));
    }

    private static void mergeSort(int[] array){
        if(array.length > 1){
            int[] left = leftList(array);
            int[] right = rightList(array);

            mergeSort(left);    //recursion
            mergeSort(right);   //recursion

            //Merging the sorted half into equal parts.
            merge(array, left, right);
        }
    }

    private static int[] leftList(int[] array){
        int size = array.length/2;
        int left[] = new int[size];

        for(int i=0; i<size; i++){
            left[i] = array[i];
        }
        return left;
    }

    private static int[] rightList(int[] array){
        int size1 = array.length/2;
        int size2 = array.length - size1;
        int right[] = new int[size2];

        for(int i=0; i<size2; i++){
            right[i] = array[i+size1];
        }
        return right;
    }

    private static void merge(int[] result, int[] left, int[] right){
        int i1 = 0; //left index.
        int i2 = 0; //right index.

        for(int i=0; i<result.length; i++){
            if(i1 < left.length && i2 < right.length){
                if(left[i1] <= right[i2]){
                    result[i1] = left[i1];
                    i1++;
                }
                else{
                    result[i2] = right[i2];
                    i2++;
                }
            }
            else if(i1 < left.length){
                result[i1] = left[i1];
                i1++;
            }
            else{
                result[i2] = right[i2];
                i2++;
            }
        }
    }
}

它给出以下输出:

    **AFTER SPLITING**
Left List: [64, 7, 52, 68, 19]
Right List: [10, 11, 14, 17, 18, 19]


    **BEFORE MERGE SORT**
[64, 7, 52, 68, 19, 10, 11, 14, 17, 18, 19]
    **AFTER MERGE SORT**
[68, 19, 19, 68, 19, 19, 11, 14, 17, 18, 19]

正如您在上面看到的,我的 leftList 和 rightList 被分成相等的部分,但没有对我的结果进行排序。

我们将不胜感激!!

最佳答案

merge 中,您使用 i1i2 索引到 result,而不是

private static void merge(int[] result, int[] left, int[] right){
    int i1 = 0; //left index.
    int i2 = 0; //right index.

    for(int i=0; i<result.length; i++){
        if(i1 < left.length && i2 < right.length){
            if(left[i1] <= right[i2]){
                result[i] = left[i1];
                i1++;
            }
            else{
                result[i] = right[i2];
                i2++;
            }
        }
        else if(i1 < left.length){
            result[i] = left[i1];
            i1++;
        }
        else{
            result[i] = right[i2];
            i2++;
        }
    }
}

关于java - 合并排序程序没有给出正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34100967/

相关文章:

java - 意外类型所需变量发现值

java - 纯 Java 中的依赖注入(inject)

c++ - 删除 C++ 中的多余空格

ruby-on-rails - 根据给定值构造新的哈希值

c++ - 如何维护一组没有重复的 vector

data-structures - DAG是否有支持有效编辑的数据结构?

java - 在 Eclipse 中使用 Java.applet.Applet

java - 谷歌 Material 设计库错误程序类型已经存在: android. support.v4.app.INotificationSideChannel$Stub$Proxy

algorithm - 测试一个数字是否是斐波那契

java - 计算 2 个链表中值的总和