当前位置: 首页 > 知识库问答 >
问题:

递归合并排序只对数组的一半排序

廖绍辉
2023-03-14

我试图实现一个递归合并排序算法来排序一个简单的整数数组,但我得到奇怪的值为索引在我的数组的后半部分。前半部分似乎排序精细,这是令人困惑的,因为它是递归实现的。随机整数数组在我的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}对于第1轮:第一个=0中间=4最后=9第1轮中的数组={15,9、12,19、49,43、57,70、78,87}

对于第2轮:first = 0 mid = 2 last = 4第2轮中的数组= {15,9,12,19,49,43,57,70,78,87}

对于第3轮:first = 0 mid = 1 last = 2第3轮中的数组= {15,9,12,19,49,43,57,70,78,87}

对于第4轮:first = 0 mid = 0 last = 1第4轮中的数组= {15,9,12,19,49,43,57,70,78,87}

对于第5轮:第5轮中的第一个=3个中间=3个最后=4个数组={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 mid=6 last=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}

共有1个答案

汪臻
2023-03-14

您的实现没有错误。如果在应用 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}

 类似资料:
  • 我写了3个方法来实现递归合并排序,参数数量有限(没有aux、lo、mid、hi)。我认为我的工作是这样的,但它并没有返回一个排序数组,尽管它在运行时没有任何编译错误。我已经摆弄了4个小时,似乎无法弄清楚我做错了什么,没有合并一个有序数组。我只从我的助教那里得到了非常模糊的输入,并且能够修复我正在遇到的一些问题,但是该方法仍然没有对项数组进行排序。欢迎任何关于我在这里做错了什么的建议。谢谢!

  • 我正在尝试编写一个ruby方法,它可以递归地执行合并排序。我有这个方法,但这是一次我偶然得到它的工作,所以我不知道它为什么工作,并很想了解我写的代码是如何工作的。在psuedocode中,我遵循的步骤如下所示。 拆分长度为n的原始数组,直到我拥有长度为1的n个数组 一次合并和排序长度为m的2个数组,以返回长度为m*2的数组 重复上述步骤,直到我有一个长度为n的当前排序数组 基本上,在我看来,这是一

  • 我有个小问题。我尝试实现合并排序算法递归。 现在我的问题: 左=合并排序(rrays.copyOfRange(iv_sort_list,0,iv_sort_list.length));右=合并排序(rrays.copyOfRange(iv_sort_list,iv_sort_list.length,iv_sort_list.length)); 如果我尝试分配我的左/右数组“mergeSort(..

  • 我正在尝试理解递归排序函数,它是mergesort算法的一部分。下面是我的代码,我几乎可以肯定它是正确的(通过在线课程)。 我理解合并的作用——它将每个子数组分解成两个较小的子数组,重复这个过程,直到子数组的长度为1(根据定义排序),然后合并。然而,这个排序函数用来完成这个任务的实际方法对我来说很难理解。也许是因为我不习惯递归函数,但是我想知道是否有人可以在第一次合并发生时阐明操作的顺序和参数是什

  • 我基本上理解了包含数组、低整数和高整数的递归合并排序函数。然而,我很好奇地试图编写一个只包含数组长度的递归合并排序函数。签名是:这比我想象的要困难得多。 我将在下面发布代码,但我的函数(我认为)只是为每次调用merge_sort()拆分数组的前半部分,本质上不涉及数组的后半部分(我认为也是如此)。 我遇到的另一个问题是,当将所有内容从辅助数组复制回原始数组(使用for循环)时,我不确定使用什么作为

  • 我正在学习计算机科学,我们目前的任务是用2^k (k = 1-16)的数组长度和随机数以及每个位置来编写合并排序算法。我们必须通过合计所有递归数组调用的长度来输出该算法的运行时间。 我们老师举了以下例子:数组长度=4:运行时=2*2 4*1=8 我目前的逻辑是,每个实例都只是数组的长度,这就是为什么我认为在每次递归调用后添加 array.length 就足够了。然而,这发出了太多的调用... 我的