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

合并和合并排序将在合并排序算法中运行多少次?

松昱
2023-03-14

这些是家庭作业问题,但我想了解它们背后的概念,而不仅仅是得到答案。

我知道MergeSort的运行时间是O(nlogn)。似乎合并方法必须运行 n 次(因为它必须合并所有数组,最终会有 n 个数组)。因此,我想我可以推断出 MergeSort() 方法将被称为 logn times。我也认为这是有道理的,因为它正在划分数组,所以它会一直将自己除以 2,所以 logn。

因此,我觉得答案分别是C和A。但我有点怀疑,因为纸条上说问题是问方法被调用了多少次,而不是运行时间。我希望得到一些建议和对计数与运行时间的解释。谢谢你。

问题如下:

18.我们定义了一个递归方法MergeSort(),将输入数组划分在中间,并递归排序每个部分。

假设我们有一个长度为n的数组,我们应用这个合并排序算法。MergeSort()方法会被调用多少次?

A. O(n)B. O(n2)C. O(log(n))D. O(n log(n))

[[[请注意,这个问题和下一个问题要求计算方法被调用的次数。这与运行时间无关;这是关于计数。]]]

19.假设我们有一个长度为n的数组,我们应用这个合并排序算法。merge()方法将被调用多少次?

A. O(n)B. O(n2)C. O(log(n))D. O(n log(n))

代码

import java.util.Arrays;

public class MergeSort
{
public static void merge(int[] data, int first, int last)
{
    int[] temp = new int[last - first + 1]; // A new array to hold the merged result
    int mid = (first + last) / 2;
    int i = first, j = mid + 1, k = 0;

    // Copy smaller item from each subarray into temp until one
    // of the subarrays is exhausted
    while (i <= mid && j <= last)
    {
        if (data[i] < data[j])
            temp[k++] = data[i++];
        else
            temp[k++] = data[j++];
    }

    // Copy remaining elements from first subarray, if any
    while (i <= mid)
        temp[k++] = data[i++];

    // Copy remaining elements from second subarray, if any
    while (j <= last)
        temp[k++] = data[j++];

    // Copy merged data back into original array
    for (i = first; i <= last; i++)
        data[i] = temp[i - first];
}

public static void merge2(int[] data, int first, int last)
{
    int mid = (first + last) / 2;
    int i = first, j = mid + 1;
    int len = last - first + 1;
    int[] temp = new int[len];

    for (int k = 0; k < len; k++)
    {
        if (i == mid + 1)               // The left part is done
            temp[k] = data[j++];
        else if (j == last + 1)         // The right part is done
            temp[k] = data[i++];
        else if (data[i] < data[j])     // Get one from the left
            temp[k] = data[i++];
        else                            // Get one from the right
            temp[k] = data[j++];
    }

    // Copy merged part back into the original array
    for (i = first; i <= last; i++)
        data[i] = temp[i - first];
}

public static void mergeSort(int[] data, int first, int last)
{
    // intermediate result
    System.out.println(Arrays.toString(Arrays.copyOfRange(data, first, last + 1)));

    if (first >= last)
        return;

    int mid = (first + last) / 2;
    mergeSort(data, first, mid);
    System.out.println("testingMerge");
    mergeSort(data, mid + 1, last);
    System.out.println("testingMerge");

    // merge two sorted parts
    merge(data, first, last);   //merge2(data, first, last);

    // intermediate result

}


public static void main(String[] args)
{
    int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    System.out.println("begin with: \n" + Arrays.toString(array));
    System.out.println("------------------");

    mergeSort(array, 0, array.length - 1);

    System.out.println("------------------");
    System.out.println("end with: \n" + Arrays.toString(array));
    }
}

共有1个答案

梁丘高朗
2023-03-14

你的答案似乎是正确的。

我们定义了一个递归方法MergeSort(),将输入数组一分为二,递归排序每一部分。

所以我们期望调用< code > merge sort < code > log n 次。因为每个递归步骤是< code>n长度的一半。

因为我们知道合并排序是O(n log n)可以在这里停止,因为< code>MergeSort被调用< code>log n次,所以< code>merge必须被调用< code>n次。但是我们也可以推理,我们必须细分< code>n个项目,直到每个输入包含一个元素。显然,我们必须合并< code>n个这样的项目列表,以得到由< code>n个项目组成的最终结果。

 类似资料:
  • 我知道合并排序算法的基本概念,但是当涉及到通过递归实现它时,我很难理解它是如何工作的。据我所知,合并排序函数将我们当前的数组分成两半,并使用递归我们一直这样做,直到每边只剩下一个元素。 如果我们的数组是{38、27、43、3、9、82、10},那么我们的递归将从使用子数组(原始数组的左侧)调用自身开始,并每次重复该过程,将数组减半并存储最左侧,直到达到1个元素: 然后在我们的第二个子例程中,我们继

  • 双向合并排序与递归合并排序有何不同? 假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4} 步骤2:{8,9}{1}{6}{4} 步骤3:{8}{9}{1}{6}{4} 现在合并 步骤4:{8,9}{1}{4,6} 步骤5:{1,8,9}{4,6} 第六步:{1,4,6,8,9} 但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并

  • 本文向大家介绍合并排序,包括了合并排序的使用技巧和注意事项,需要的朋友参考一下 合并排序技术基于分而治之。我们将整个数据集分成较小的部分,然后按排序顺序将它们合并成较大的部分。在最坏情况下它也非常有效,因为该算法在最坏情况下的时间复杂度也较低。 合并排序技术的复杂性 时间复杂度: 所有情况下为O(n log n) 空间复杂度:  O(n) 输入输出 算法 合并(数组,左,中,右) 输入- 数据集数

  • 问题是关于从16:43到23:34的视频中的合并排序http://youtu.be/M814OagXWTI?t=16m43s 在退出左/右排序合并递归后,我不清楚我们是如何合并回这些子数组的。让我们从最底部开始,当我们的元素被分成两个子数组时,一个左子数组称为B,一个右子数组称为C。在16:43左右,我们跳转到合并函数,对数组B和C进行排序,这两个数组只有8和3。合并排序函数(下面的代码)基本上通

  • 我在理解外部排序算法中的合并步骤时遇到了一定的困难。我在维基百科上看到了这个例子,但我无法理解。 外部排序的一个例子是外部合并排序算法,它对每个适合RAM的块进行排序,然后将排序后的块合并在一起。例如,对于仅使用100 MB RAM对900 MB数据进行排序:1)读取主内存中的100 MB数据,并通过一些常规方法进行排序,如快速排序。2) 将排序后的数据写入磁盘。3) 重复第1步和第2步,直到所有

  • 本文向大家介绍Haskell合并排序,包括了Haskell合并排序的使用技巧和注意事项,需要的朋友参考一下 示例 有序合并两个有序列表 保留重复项: 自顶向下版本: 定义这种方式是为了清楚而非效率。 使用示例: 结果: 自下而上的版本: