Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并排序正在复制数组项_Java_Arrays_Algorithm_Sorting - Fatal编程技术网

Java 合并排序正在复制数组项

Java 合并排序正在复制数组项,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,根据Cormen对算法的介绍,我试图在Java中实现合并排序算法。我的代码(下面)的问题是,主数组在合并步骤中复制了它的一些条目 有人能发现我做错了什么吗 谢谢大家! static void merge(int a[], int p, int q, int r) { int n1 = q - p; int n2 = (r - q); int [] left = new int[n1 + 1];

根据Cormen对算法的介绍,我试图在Java中实现合并排序算法。我的代码(下面)的问题是,主数组在合并步骤中复制了它的一些条目

有人能发现我做错了什么吗

谢谢大家!

  static void merge(int a[], int p, int q, int r)
        {
            int n1 = q - p;
            int n2 = (r - q);
            int [] left = new int[n1 + 1];
            int [] right = new int[n2 + 1];
            int pp = p;
            int qq = q;
            for(int i = 0; i < n1; i++)
            {
                left[i] = a[++pp];
            }
            for(int i = 0; i < n2; i++)
            {
                right[i] = a[++qq];
            }
            left[left.length-1] = Integer.MAX_VALUE;
            right[right.length-1] = Integer.MAX_VALUE;
            int i = 0;
            int j = 0;
            for(int k = p; k < r; k++)
            {
                if(left[i] <= right[j])
                {
                    a[k] = left[i];
                    i++;
                }
                else
                {
                    a[k] = right[j];
                    j++;
                }
            }
        }

        static int [] mergeSort(int a[], int p, int r)
        {
            if(p < r)
            {
                int q = (p + r)/2;
                mergeSort(a, 1, q);
                mergeSort(a, q + 1, r);
                merge(a, p, q, r);
            }
            return a;
        }
静态无效合并(inta[],intp,intq,intr)
{
int n1=q-p;
int n2=(r-q);
int[]左=新int[n1+1];
int[]右=新int[n2+1];
int-pp=p;
int qq=q;
对于(int i=0;i如果(左[i]我认为这是错误的(以及它在下一个循环中的兄弟):

您希望从pp=p开始复制,因此在访问数组元素之前不要递增:

left[i] = a[pp++];

这里的部分问题是书中的示例显然使用了从1到长度的索引范围。如果将索引范围从0更改为长度-1,这将更简单,我在回答的其余部分中假设了这一点

按照laune的回答,在复制到左[]和右[]时使用post增量(因为索引范围为0到长度为1)

主要问题是合并函数未检查合并过程中是否到达左运行或右运行的末尾。可以通过将内部if更改为:

                if (i < n1 && (j >= n2 || left[i] <= right[j]))
未显示,但对mergeSort的初始调用应为:

                mergeSort(a, p, q);
                mergeSort(a, q, r);
                mergeSort(a, 0, a.length);
不需要在左侧和右侧分配额外的元素(因为索引范围是0到长度-1)


最好是通过调试器,并尝试了解它为什么不起作用。您还可以在internet上搜索实际工作的代码,并将其与您的代码进行比较,以了解错误所在有趣的事实:MergeSort可以非常干净地实现,而无需诉诸递归,只需分配一个额外的数组.查看Wikipedia页面(自下而上的实现)。我感觉像是
集合。排序
或是附近的东西会提供您想要的功能;我知道这并不能回答您的问题,但这是一个想法。(
merge sort正在复制数组条目
此外,它似乎也会影响标题中的字母
i
                mergeSort(a, p, q);
                mergeSort(a, q, r);
                mergeSort(a, 0, a.length);
            int [] left = new int[n1];
            int [] right = new int[n2];