【发布时间】:2014-07-08 03:16:50
【问题描述】:
我在尝试实现递归归并排序时一直很头疼,但我不断遇到问题。 现在,我在添加元素时遇到了很多麻烦,这些元素导致了我之前 75% 的问题。 这是实现的代码,主要问题是合并部分:
static public void DoMerge(LinkedList <Contacto> L, int left, int mid, int right)
{
LinkedList <Contacto> temp = new LinkedList <Contacto>();
int i, left_end, num_elements, tmp_pos, comp;
left_end = (mid - 1);
tmp_pos = left;
num_elements = (right - left + 1);
while ((left <= left_end) && (mid <= right))
{
comp= L.get(left).get_name().compareTo(L.get(mid).get_name());
if (comp<=0)
temp.add(tmp_pos++,L.get(left++));
else
temp.add(tmp_pos++,L.get(mid++));
}
while (left <= left_end)
temp.add(tmp_pos++,L.get(left++));
while (mid <= right)
temp.add(tmp_pos++,L.get(mid++));
for (i = 0; i < num_elements; i++)
{
L.set(right, temp.get(right));
right--;
}
}static public void MergeSort_Recursive(LinkedList <Contacto> L, int left, int right)
{
int mid;
if (right > left)
{
mid = (right + left) / 2;
MergeSort_Recursive(L, left, mid);
MergeSort_Recursive(L, (mid + 1), right);
DoMerge(L, left, (mid+1), right);
}
}
主要问题再次是合并部分,它一直困扰着我,特别是将元素添加到临时列表中。编译器抛出了一个越界异常。
【问题讨论】:
-
为什么不直接使用 Collections.sort()?
-
如果你正在排序一个链表,你真的不应该使用
get。它会毁了你的表现。您可能想要使用iterator方法获取迭代器并使用它。
标签: java algorithm recursion linked-list mergesort