簡體   English   中英

LinkedList上的遞歸合並排序

[英]Recursive Mergesort on LinkedList

嘗試實現遞歸mergesort一直讓我頭疼,但問題不斷出現。 現在,我在添加元素時遇到了很多麻煩,這些問題早些時候引起了我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);
 }
}

再次出現的主要問題是合並部分,該部分一直困擾着我,特別是將元素添加到臨時列表中。 編譯器使我超出范圍。

問題是

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

您初始化了一個空列表。 但是,這一行:

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

您將一個對象插入索引tmp_pos ,該對象可以大於當前的temp大小(首先, temp大小為零)。 (了解有關添加的更多信息

您可以通過了解以下事實來解決此問題:對於合並排序, 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--;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM