[英]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.