單鏈表的歸併排序

2021-08-11 14:27:16 字數 995 閱讀 3456

題目:單鏈表的歸併排序

思路:首先找到鍊錶的中間節點,將原始鍊錶一分為二,遞迴進行該操作,直到被劃分的兩個鍊錶包含的節點少於等於1個,即該次劃分後兩個鍊錶已經有序。然後依次合併兩個有序的鍊錶,直到所有劃分都合併完,即排序完畢。主要編寫將兩個有序鍊錶合併為乙個有序鍊錶的函式。

#includeusing namespace std;

//鍊錶結構

struct listnode

};//將兩個有序鍊錶合併為乙個有序鍊錶

listnode* mergelist(listnode* l1, listnode* l2)

else

while (p1 != null && p2 != null)

prv->next = p2;

while (p2 != null && p1!=null && p2->key < p1->key)

if(p1!=null)

prv->next = p1;

} listnode* rethead =dummy->next;//要返回的第乙個節點

delete dummy;

return rethead;

}//歸併主函式

listnode* listmergesort(listnode* phead)

listnode* lefthead = phead;

listnode* righthead = slow->next;

slow->next = null;

lefthead = listmergesort(lefthead);

righthead = listmergesort(righthead);

return mergelist(lefthead, righthead);

}void showlist(listnode* phead)

cout << endl;

}int main()

單鏈表歸併排序

1 對於鍊錶來說,由於其元素的訪問只能是順序訪問,而快速排序是改進後的氣泡排序,需要隨機訪問資料,不合適。採用歸併排序方式對鍊錶元素進行訪問 2 需要的步驟 1 分割 將一段鍊錶分成兩部分 2 排序 將兩端已經有序的鍊錶合併 3 分治遞迴 遞迴操作 將鍊錶plist分割,並把分割後的兩段鍊錶第乙個元...

單鏈表的歸併排序

question 148.sort list sort a linked list in o n log n time using constant space complexity.中文 使用恆定的空間複雜度排序乙個鍊錶,要求時間複雜度是o nlogn 我們知道題目的要求是時間複雜度是o nlog...

Java單鏈表歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。找到中間點,然後分割 publi...