为什么我的Merge Sort不保存已排序的数组?

时间:2017-10-06 01:28:25

标签: java sorting mergesort

我意识到我不会将我的临时点归还给任何东西,但我能做些什么来解决这个问题呢?

现在它正确排序,但是当它排序下一层时,它们仍未被排除。

未提供的观点:

( - 2,-42) (-15,2) (32,8) (-26,21) (39,-42) (-40,-18) (-30,7) (-12,-28) (19,-16) (-16,-38)

SORTED POINTS:

( - 2,-42) (-15,2) (32,8) (-26,21) (39,-42) (-40,-18) (-30,7) (-12,-28) (19,-16) (-16,-38)

如果我使用调试器逐步执行我的程序,我可以看到它正确地对每个分区进行排序,但它不会延续到下一次合并。

private void mergeSortRec(Point[] pts)
{
    int middle = pts.length / 2;


    if( pts.length ==1)
    {
        return;
    }

    Point[] left = new Point[middle];
    Point[] right = new Point[pts.length - middle];


    for(int i = 0; i < middle; i++)
        left[i] = pts[i];

    for( int j = 0; j < pts.length - middle; j++ )
        right[j] = pts[middle+j];

    mergeSortRec(left);
    mergeSortRec(right);

    merge(left, right);
}

private Point[] merge(Point[] left, Point[] right)
{
    int x = 0;
    int i = 0;
    int j = 0;
    Point[] tempPoints = new Point[(left.length) + (right.length)];

    while( i < left.length || j < right.length )
    {
        if( i < left.length && j < right.length)
        {   
            if( pointComparator.compare(left[i], right[j]) == -1 )
            {
                tempPoints[x] = left[i];
                x++;
                i++;
            }
            else
            {
                tempPoints[x] = right[j];
                x++;
                j++;
            }
        }
        else if (i == left.length)
        {
            tempPoints[x] = right[j];
            x++;
            j++;
        }
        else if( j == right.length)
        {
            tempPoints[x] = left[i];
            x++;
            i++;
        }

    }

    return tempPoints;
}

2 个答案:

答案 0 :(得分:0)

在mergeSortRec中,您不会返回任何内容。

左右数组得到排序和合并,但随后超出范围。尝试更改代码以返回合并结果。

答案 1 :(得分:0)

你没有对merge的结果做任何事情,所以简单地丢弃了合并的数组。而且,您需要合并回原始数组。

更改您的merge数组,将要合并的数组作为参数:

private void merge(Point[] left, Point[] right, Point[] pts)

并使用pts代替tempPoints;打电话给:

merge(left, right, pts);

因为pts是您要更新的数组,并且长度正确。