【问题标题】:Recursive Mergesort on LinkedListLinkedList 上的递归合并排序
【发布时间】: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


【解决方案1】:

问题是

LinkedList <Contacto> temp = new LinkedList <Contacto>();

您初始化了一个空列表。但是,这一行:

temp.add(tmp_pos++,L.get(left++));

您插入一个对象来索引tmp_pos,它可以大于当前的临时大小(首先,temp 的大小为零)。 (阅读更多关于add.的信息)

你可以通过理解来解决这个问题,对于合并排序,temp 实际上被用作堆栈,所以这部分不是必需的temp.add(tmp_pos++,L.get(left++));,而是使用temp.add(L.get(left++));。 (以类似方式替换其他语句)。

对于最后一部分,只需使用

 for (i = 0; i < num_elements; i++)
 {
       L.set(right, temp.removeLast());
       right--;
 }

【讨论】:

  • 这是真的。实际上我对添加有一些疑问,所以我想如果我给它一个比列表大小高的索引,它会简单地将它添加为最后一个元素。好吧,在添加添加到最后之后,我还将最后一部分切换为删除并获取最后一个元素。但是,在我比较两个字符串的代码部分中,索引一直高于列表。我暂时尝试修改条件,但提出了更多问题,所以我就这样离开了。问题主要是索引最终成为比较索引的列表大小。
  • @Auraldo 嗯,我不明白你的意思,但你总是可以打印出 left 和 mid 的索引来检查:) 这对你的调试很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2019-01-22
  • 2020-03-04
  • 2010-12-06
相关资源
最近更新 更多