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

合并排序 - 如何汇总所有递归数组调用?

牟稳
2023-03-14

我正在学习计算机科学,我们目前的任务是用2^k (k = 1-16)的数组长度和随机数以及每个位置来编写合并排序算法。我们必须通过合计所有递归数组调用的长度来输出该算法的运行时间。

我们老师举了以下例子:数组长度=4:运行时=2*2 4*1=8

我目前的逻辑是,每个实例都只是数组的长度,这就是为什么我认为在每次递归调用后添加 array.length 就足够了。然而,这发出了太多的调用...

我的数组输出…

长度4: 4 8 12 (0...3)

长度8: 8 16 24 32 40 48 56 (0...7)

长度16:16 32 48 64 80 96 112 128 144 160 176 192 208 224 240(0…15)

有一点很清楚,输出总是等于初始数组长度。我已经把正确的值加粗了,这些值应该是最终的输出...如果我理解正确的话。

有人能帮我计算运行时间吗?

我的代码:

请记住,intArr大小通常不是16[或8或4],而是“值”,即2^k引用。我降低了大小,以便更容易在运行时计算中发现故障。

import java.util.Random;

public class Mergesort {

    Random generator = new Random();

    static int runtime;
    static int base = 2;
    static int potency = 1 + (int) (Math.random() * ((16)));
    static int value = (int) java.lang.Math.pow(base, potency);
    public static int[] intArr = new int[16];

    {
        for (int i = 0; i < intArr.length; i++) {
            intArr[i] = generator.nextInt(100);
        }
    }

    public static void main(String[] args) {
        Mergesort ms = new Mergesort();
        int[] arr = ms.splitHalf(0, intArr.length - 1); 

        System.out.println("Mergesort-Algorithm" + "\n" + "\n" + "Position:" + " Wert");
        for (int i = 0; i < arr.length; i++) { 
            System.out.println(i + 1 + ": " + arr[i]);
        }
    }

    public int[] splitHalf(int l, int r) { 
        if (l < r) { 
            int q = (l + r) / 2;
            splitHalf(l, q); 
            splitHalf(q + 1, r); 
            merge(l, q, r); 
        }
        return intArr; 
    }

    private void merge(int l, int q, int r) { 
        int[] arr = new int[intArr.length];
        int left;
        int right;

        for (left = l; left <= q; left++) {
            arr[left] = intArr[left];
        }
        for (right = q + 1; right <= r; right++) {
            arr[r + q + 1 - right] = intArr[right];
        }
        left = l;
        right = r;
        for (int k = l; k <= r; k++) { 
            if (arr[left] <= arr[right]) { 
                intArr[k] = arr[left]; 
                left++; 
            } else {
                intArr[k] = arr[right]; 
                right--; 
            }
        }
        runtime = runtime + arr.length;
        System.out.println(runtime);
    }
}

共有1个答案

郁鸿博
2023-03-14

您使用的是整数数组<code>intArr</code>,在整个程序中它的长度是固定的。因此,每次执行runtime=runtimearr.length添加数组的初始长度。然而,它需要添加您正在处理的当前“范围”以获得正确的数字。

您应该更改您的方法接口,以获得更好的代码结构。

// gets two sorted arrays and returns the merged sorted array of both
static int[] merge(int[] firstSortedArray, int[] secondSortedArray) {
    int[] result = int[firstSortedArray.length + secondSortedArray.length];
    // merge both arrays into result
    return result;
}

// gets an input array and returns the same array in a sorted fashion
static int[] split(int[] inputArray) {
    // an array of size zero/one is already sorted and can be return unchanged
    if(inputArray.length == 0 || inputArray.length == 1)
        return inputArray; 

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

  • 我试图实现一个递归合并排序算法来排序一个简单的整数数组,但我得到奇怪的值为索引在我的数组的后半部分。前半部分似乎排序精细,这是令人困惑的,因为它是递归实现的。随机整数数组在我的main方法中初始化。 } 这会产生以下输出: 未排序数组={15,9,12,19,49,43,57,70,78,87}对于第1轮:第一个=0中间=4最后=9第1轮中的数组={15,9、12,19、49,43、57,70、7

  • 目前正在用Daniel Liang的C++入门自学C++。 关于合并排序的话题,我似乎无法理解他的代码是如何递归调用自己的。 我理解合并排序的一般概念,但我很难具体理解这段代码。 在本例中,我们首先将列表1,7,3,4,9,3,3,1,2及其大小(9)传递给mergeSort函数。从那里,我们将列表一分为二,直到数组大小达到1。在这种情况下,我们会得到:1,7,3,4->1,7->1。然后我们进入

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

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

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