首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于LinkedList的递归归并排序

基于LinkedList的递归归并排序
EN

Stack Overflow用户
提问于 2014-07-08 11:16:51
回答 1查看 112关注 0票数 1

我一直在尝试实现递归合并排序时感到头疼,但我总是遇到一个接一个的问题。现在,我在添加元素时遇到了很多麻烦,这些元素导致了我之前75%的问题。这是实现的代码,主要问题是合并部分:

代码语言:javascript
复制
 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);
 }
}

主要的问题还是合并部分,它一直困扰着我,特别是将元素添加到临时列表中。编译器抛出了一个越界异常。

EN

回答 1

Stack Overflow用户

发布于 2014-07-08 11:45:22

问题是

代码语言:javascript
复制
LinkedList <Contacto> temp = new LinkedList <Contacto>();

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

代码语言:javascript
复制
temp.add(tmp_pos++,L.get(left++));

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

您可以通过理解以下内容来解决此问题:对于合并排序,temp实际上用作堆栈,因此此部分不是必需的temp.add(tmp_pos++,L.get(left++));,请改用temp.add(L.get(left++));。(以类似的方式替换其他语句)。

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

代码语言:javascript
复制
 for (i = 0; i < num_elements; i++)
 {
       L.set(right, temp.removeLast());
       right--;
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24623143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档