Java MergeSort算法只返回输入数组的一半

Java MergeSort算法只返回输入数组的一半,java,mergesort,Java,Mergesort,必须为学校班级学习不同的排序方法,但在编码合并排序时遇到问题。希望有人能找到问题的原因 public static Movie[] mergeSortYears(Movie[] M) { Movie[] toReturn = new Movie[M.length]; if(M.length>1) { int length = M.length/2; Movie[] LeftAr = Arrays.copyOfRange(M,0,le

必须为学校班级学习不同的排序方法,但在编码合并排序时遇到问题。希望有人能找到问题的原因

public static Movie[] mergeSortYears(Movie[] M)
{
    Movie[] toReturn = new Movie[M.length];
    if(M.length>1)
    {
        int length = M.length/2;

        Movie[] LeftAr = Arrays.copyOfRange(M,0,length-1);

        Movie[] RightAr = Arrays.copyOfRange(M,length,M.length-1);

        Movie[] Left = mergeSortYears(LeftAr);
        Movie[] Right = mergeSortYears(RightAr);

        return mergeYears(Left,Right);
    }
    return M;
}

public static Movie[] mergeYears(Movie[] LeftAR, Movie[] RightAR)
{
    Movie[] Left = LeftAR;
    Movie[] Right = RightAR;
    int Total = LeftAR.length + RightAR.length;
    int i,li,ri;
    Movie[] M = new Movie[Total];
    i = 0;
    li = 0;
    ri = 0;
    while(i< Total)
    {
        if((li < Left.length) && (ri<Right.length))
        {
            if(Left[li].Year < Right[ri].Year)
            {
                M[i] = Left[li];
                i++;
                li++;
            }
            else
            {
                M[i] = Right[ri];
                i++;
                ri++;
            }
        }
        else
        {
            if(li >= Left.length)
            {
                while(ri<Right.length)
                {
                    M[i] = Right[ri];
                    i++;
                    ri++;
                }
            }
            if(ri >= Right.length)
            {
                while(li < Left.length)
                {
                    M[i] = Left[li];
                    li++;
                    i++;
                }
            }

        }
    }
    return M;
}
publicstaticmovie[]mergeSortYears(Movie[]M)
{
电影[]返回=新电影[M.length];
如果(M.长度>1)
{
整数长度=M.length/2;
Movie[]LeftAr=Arrays.copyOfRange(M,0,长度-1);
Movie[]RightAr=Arrays.copyOfRange(M,length,M.length-1);
Movie[]Left=mergeSortYears(LeftAr);
电影[]右=合并姐妹会(右);
返回年份(左、右);
}
返回M;
}
公共静态电影[]合并年(电影[]左,电影[]右)
{
电影[]左=左;
电影[]右=右;
int Total=LeftAR.length+RightAR.length;
int i,li,ri;
电影[]M=新电影[总计];
i=0;
li=0;
ri=0;
而(i
是的,我承认它并不完全“优雅”,但这是我所能做的最好的。但是当我调用函数时,问题出现了。我传入了一个包含8个“电影”的数组(与任务相关)它返回的是正确排序的,但只有4个。真正让我困惑的是,我不知道它是如何丢失这4个。这不像“前4个”或“最后4个”丢失。每次都是完全相同的4个

电影确实包含“年”变量,该变量包含电影的制作年份,这是本例中电影的排序依据。这些确实在大多数电影中重复出现,但这似乎不是问题的原因


(可以确认是出现的代码导致了问题,本作业的早期部分让我使用其他方法进行排序,所有这些方法仍然有效)

您的代码很难看(但您知道)。
Movie[]RightAr=Arrays.copyOfRange(M,length,M.length-1);
应该是
Movie[]RightAr=Arrays.copyOfRange(M,length,M.length)编辑:我是个白痴,换错了行。这就解决了所有问题。。