【发布时间】: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