Java 有人能编码并解释mergesort的合并部分吗?

Java 有人能编码并解释mergesort的合并部分吗?,java,algorithm,Java,Algorithm,几个小时以来,我一直在努力理解mergesort的合并部分,我看了很多教程和演练。我不理解mergesort的合并部分。理论上,我理解。但是,试图通过代码实现它是我遇到困难的地方。这并不是说我不理解其中的任何合并部分。我明白了为什么需要几个指针来跟踪while循环中条件语句背后的索引和推理。但在那之后我就被卡住了。我在merge方法中写了一条关于im被卡住的地方的评论。如果有人能向我解释我需要用Java编写什么代码,以及它背后的原因,那就太好了 编辑:在合并方法中添加了两个新的while循环。我

几个小时以来,我一直在努力理解mergesort的合并部分,我看了很多教程和演练。我不理解mergesort的合并部分。理论上,我理解。但是,试图通过代码实现它是我遇到困难的地方。这并不是说我不理解其中的任何合并部分。我明白了为什么需要几个指针来跟踪while循环中条件语句背后的索引和推理。但在那之后我就被卡住了。我在merge方法中写了一条关于im被卡住的地方的评论。如果有人能向我解释我需要用Java编写什么代码,以及它背后的原因,那就太好了

编辑:在合并方法中添加了两个新的while循环。我想剩下要做的就是如何将已排序的分区复制到
input
数组中。我想在那之后,它应该工作得很好。。。希望如此

编辑2:不管上面说什么,我只是看到它没有正确排序。希望有人能修改我的代码,并解释这个过程

    public static void merge(int[] input, int start, int mid, int end) {
        if (input[mid - 1] <= input[mid]) {
            return;
        }
        int i = start;
        int j = mid;
        int tempIndex = 0;

        int[] temp = new int[end - start];
        
        //If i is greater than mid or j is greater than end, that means that half of the array is sorted
        while (i < mid && j < end) {
            temp[tempIndex++] = input[i] <= input[j] ? input[i++] : input[j++];
        }
        //added the two loops below
        while(i < mid){
            temp[tempIndex++] = input[i++];
        }
        while(j < end){
            temp[tempIndex++] = input[j++];
        }
        
    }
    ```
公共静态无效合并(int[]输入,int开始,int中间,int结束){

if(input[mid-1]MergeSort是一种分而治之的策略

假设你有8个元素

  • 这8个元素被分成4个元素(左/右),并对每个元素调用mergeSort。我们现在将忽略merge,并进行更深入的研究
  • 这4个元素进一步拆分为每个元素2个,并在2个元素数组上调用mergeSort
  • 这2个元素被进一步拆分为每个元素1个,并对每个元素调用mergeSort,此时它将返回而不执行任何操作
  • 我们终于开始第一次调用merge了。那么merge做什么呢?merge连接两个排序列表。当每个列表只有一个元素时,只需选择一个元素而不是另一个。因此,让我们跳到这4个元素,并提供以下示例:
当4元素子列表调用merge时,它可能具有以下内容:

1 3 2 4
每个子数组(1,3)和(2,4)都已经按照前面的合并进行了排序。因此,我们现在需要在合并它们时对数组进行排序,就像这样(我将使用一个单独的输出数组来演示应该发生什么,但它可以就地完成):

for(inti=0,j=2,k=0;k<4;k++)
{
int-idx;
if((j>=4)| |(i<2&&inputArray[i]2 | |输入阵列[j]
如你所见,一开始我指向1,j指向2。因为1<2,我被选中,1被输出。因为我被选中,我得到递增。现在,我指向3,j指向2。因为2<3,j被选中…依此类推,直到元素用完

合并后,它将在具有2个4元素边的较大数组上被调用,重复上述步骤

下面是没有硬编码的通用代码

        public void Merge(int[] input, int start, int mid, int end)
        {
            if (input[mid - 1] <= input[mid])
            {
            }
            else
            {
                int[] tmp = new int[end - start];
                for (int i = start, j = mid, k = 0; k < tmp.Length; k++)
                {
                    int idx;
                    if ((j >= end) || (i < mid && input[i] < input[j]))
                    {
                        idx = i++;
                    }
                    else // j < end && (i > mid || inputArray[j] < inputArray[i])
                    {
                        idx = j++;
                    }
                    tmp[k] = input[idx];
                }

                for (int i = start, j = 0; i < end; i++, j++)
                {
                    input[i] = tmp[j];
                }
            }
        }
公共无效合并(int[]输入,int开始,int中间,int结束)
{
if(输入[mid-1]=end)| |(imid||inputArray[j]
提示检查是否
tempIndex
,然后继续填充arrayMergesort将数组“拆分”为两部分,然后分别对每个部分进行排序。合并检查从哪个部分获取下一项
input[i]我了解该部分,问题是在while循环中断后,我不知道如何使剩余的数字与排序数组合并。我在(I
时做了类似于
的事情,但它似乎不起作用,我在理解您的方法时遇到了一点困难。for循环中的值是否应该表示数组的开始、中间和结束?是的,我硬编码以映射到示例:在代码中,0是开始,2是中间,4是结束,k是tmpIndex,outputArray是tmpArray。完成此循环后,将对tmpArray进行排序和填充-这意味着必须将其复制回主数组-即(对于int i=0,j=start;i        public void Merge(int[] input, int start, int mid, int end)
        {
            if (input[mid - 1] <= input[mid])
            {
            }
            else
            {
                int[] tmp = new int[end - start];
                for (int i = start, j = mid, k = 0; k < tmp.Length; k++)
                {
                    int idx;
                    if ((j >= end) || (i < mid && input[i] < input[j]))
                    {
                        idx = i++;
                    }
                    else // j < end && (i > mid || inputArray[j] < inputArray[i])
                    {
                        idx = j++;
                    }
                    tmp[k] = input[idx];
                }

                for (int i = start, j = 0; i < end; i++, j++)
                {
                    input[i] = tmp[j];
                }
            }
        }