java - 递归归并排序仅对数组的一半进行排序

标签 java recursion mergesort

我正在尝试实现递归合并排序算法来对简单的整数数组进行排序,但我在数组后半部分的索引中得到了奇怪的值。前半部分似乎排序得很好,考虑到它是递归实现的,这很令人困惑。随机整数数组在我的 main 方法中初始化。

public class MergeSort {

public static int Rounds = 1;
public static void MergeSort(Comparable[] ToSort, Comparable[] temp, int first, int last) {
    if(first < last) {
        int mid = (first + last) / 2;

        //Test Block
        System.out.print("For Round " + Rounds + ":\n");
        System.out.print("first = " + first + "   mid = " + mid + "   last = " + last + "\n");
        Rounds++;
        System.out.print("Array in Round " + (Rounds - 1) + " = {");
        for(int i = 0; i <= ToSort.length - 1; i++) {
            System.out.print(ToSort[i]);
            if(i < ToSort.length - 1)
                System.out.print(", ");
            else {
                System.out.print("}\n\n");
            }
        }

        MergeSort(ToSort, temp, first, mid);
        MergeSort(ToSort, temp, mid + 1, last);
        Merge(ToSort, temp, first, mid + 1, last);
    }

}

public static void Merge(Comparable[] ToSort, Comparable[] temp, int first, int mid, int last) {
    int beginHalf1 = first;
    int endHalf1 = mid - 1;
    int beginHalf2 = mid;
    int endHalf2 = last;
    int index = first;
    int Elements = (last - first) + 1;

    while(beginHalf1 <= endHalf1 && beginHalf2 <= endHalf2) {
        if(ToSort[beginHalf1].compareTo(ToSort[beginHalf2]) < 0) temp[index++] = ToSort[beginHalf1++];
        else temp[index++] = ToSort[beginHalf2++];
    }

    while(beginHalf1 <= endHalf1) temp[index++] = ToSort[beginHalf1++];
    while(beginHalf2 <= endHalf2) temp[index++] = ToSort[beginHalf2++];
    for(int i = 0; i < Elements; i++, last--) ToSort[last] = temp[last];

}

}

这会产生以下输出:

未排序的数组 = {15, 9, 12, 19, 49, 43, 57, 70, 78, 87} 对于第一轮: 第一个 = 0 中间 = 4 最后 = 9 第 1 轮数组 = {15, 9, 12, 19, 49, 43, 57, 70, 78, 87}

第二轮: 第一个 = 0 中间 = 2 最后 = 4 第 2 轮数组 = {15, 9, 12, 19, 49, 43, 57, 70, 78, 87}

第三轮: 第一个 = 0 中间 = 1 最后 = 2 第 3 轮数组 = {15, 9, 12, 19, 49, 43, 57, 70, 78, 87}

第四轮: 第一个 = 0 中间 = 0 最后 = 1 第 4 轮数组 = {15, 9, 12, 19, 49, 43, 57, 70, 78, 87}

第 5 轮: 第一个 = 3 中间 = 3 最后 = 4 第 5 轮数组 = {9, 12, 15, 19, 49, 43, 57, 70, 78, 87}

第 6 轮: 第一个 = 5 中间 = 7 最后 = 9 第 6 轮数组 = {9, 12, 15, 19, 49, 43, 57, 70, 78, 87}

第 7 轮: 第一个 = 5 中间 = 6 最后 = 7 第 7 轮数组 = {9, 12, 15, 19, 49, 43, 57, 70, 78, 87}

第 8 轮: 第一个 = 5 中间 = 5 最后 = 6 第 8 轮数组 = {9, 12, 15, 19, 49, 43, 57, 70, 78, 87}

第 9 轮: 第一个 = 8 中间 = 8 最后 = 9 第 9 轮数组 = {9, 12, 15, 19, 49, 43, 57, 70, 78, 87}

最佳答案

您的实现没有错误。如果您在应用 MergeSort 方法后打印数组,则它已排序:

Comparable[] a = new Comparable[]{15, 9, 12, 19, 49, 43, 57, 70, 78, 87};
Comparable[] b = new Comparable[a.length];
MergeSort.MergeSort(a, b, 0, a.length - 1);

for (int i = 0; i <= a.length - 1; i++) {
    System.out.print(a[i]);
    if (i < a.length - 1)
        System.out.print(", ");
    else {
        System.out.print("}\n\n");
    }
}

将打印 9, 12, 15, 19, 43, 49, 57, 70, 78, 87}

关于java - 递归归并排序仅对数组的一半进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46507627/

相关文章:

java - qrgen 和 zxing 库出现 java.lang.NoSuchMethodError 异常

java - java 1.6 中未给出阶乘递归异常

c - C中的合并排序错误

java - 如果标签包含目标,则标签之间的正则表达式匹配

java - 使用 org.codehaus.jackson 反序列化 JSON 字符串

scala - 理解Y-Combinator的实现

c++ - 可变参数模板未编译

java - 查找插入位置

c++ - 归并排序实现

java - 保存实体集合时未找到 PK(错误??)