我正在尝试为字符串的arraylists实现合并排序算法,但我似乎无法找到阻碍arraylist排序的错误。
private static void sort(java.util.ArrayList<String> a)
{
// End recursion
if (a.size() < 2)
{
return;
}
int mid = a.size() / 2;
java.util.ArrayList<String> left = new java.util.ArrayList<String>();
int i;
for (i = 0; i < mid; i++)
{
left.add(a.remove(i));
}
java.util.ArrayList<String> right = new java.util.ArrayList<String>();
// Copy the second half to the "right"
for ( ; i < a.size(); i++)
{
right.add(a.remove(i));
}
sort(left);
sort(right);
merge(a, left, right);
}
private static void merge(java.util.ArrayList<String> result, java.util.ArrayList<String> left,java.util.ArrayList<String> right)
{
int i, l, r;
i = l = r = 0;
while (l < left.size() && r < right.size())
{
if ((left.get(l)).compareTo(right.get(r)) < 0)
{
result.add(left.get(l));
l++;
}
else
{
result.add(right.get(r));
r++;
}
i++;
}
while (l < left.size())
{
result.add(left.get(l));
l++;
i++;
}
// Append rest of the values in the right half, if any...
while (r < right.size())
{
result.add(right.get(r));
r++;
i++;
}
}
答案 0 :(得分:1)
问题出在sort
函数中。
使用a.remove(i)
时会发生什么?索引i
中的元素将从数组中删除,因此先前位于索引i+1
的元素现在位于索引i
,并且数组大小递减。如果您再次i++
,再次a.remove(i)
,则会跳过数组中的一个元素。
在sort
函数中,在致电merge
时,您应该检查a.size() == 0
。你会发现并非总是如此。 merge
函数看起来很好,但你的数组拆分是不正确的:你忘记了使用remove(int i)
更改数组;它的大小和元素的索引。