【问题标题】:Why is my Merge Sort not saving the sorted arrays?为什么我的合并排序不保存已排序的数组?
【发布时间】:2017-10-06 01:28:25
【问题描述】:

我意识到我没有将我的 tempPoints 归还给任何东西,但我能做些什么来解决这个问题?

现在它排序正确,但是当它对下一层的一半进行排序时,它们仍然未排序。

未排序的点:

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

排序点:

(-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;
}

【问题讨论】:

  • 因为你没有对merge的返回值做任何事情? (请注意,您应该将它们合并回原始数组)
  • 好的,在我的合并结束时。我将 tempPoints 复制到存储在我的对象中的数组中,但索引在每次合并开始时设置为 0。我该怎么做才能保持排序索引?我删除了我的退货并将方法更改为无效。刚看到其他cmets

标签: java sorting mergesort


【解决方案1】:

在 mergeSortRec 你没有返回任何东西。

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

【讨论】:

    【解决方案2】:

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

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

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

    并使用pts 而不是tempPoints;像这样调用:

    merge(left, right, pts);
    

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

    【讨论】:

    • 谢谢。我回去将所有“pts”和“tempPoints”更改为对象数组。终于工作了,我学会了。
    猜你喜欢
    • 2021-12-09
    • 2021-06-19
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多