當前位置:
首頁 >
数据结构--链表--单链表归并排序mergesort
發布時間:2024/7/5
36
豆豆
生活随笔
收集整理的這篇文章主要介紹了
数据结构--链表--单链表归并排序mergesort
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路:
1.將鏈表的中點找到,對其切分成2條
2.繼續步驟1,切成4條,8條。。。,直至每段鏈表只有1個元素
3.歸并操作,對兩兩鏈表進行合并排序,并返回回并后的鏈表的頭結點,依次向上遞歸回去
C++代碼實現
鏈表頭文件鏈接:https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/linkedList/homework
//歸并排序 // Created by mingm on 2019/3/23. // #include <iostream> #include <time.h> #include <cstdlib> #include "./homework/singleList.cpp" using namespace std;ListNode GetMidNode(ListNode s) //快慢指針法,獲取中間節點 {ListNode fast, slow;fast = s->pNext;//讓快指針早點到達末位,慢指針指向中點或者(偶數個長度時)中點前一個位置slow = s;while(fast && fast->pNext){fast = fast->pNext->pNext;slow = slow->pNext;}return slow; } ListNode mergeList(ListNode L, ListNode R) //歸并函數 {if(L == NULL) //如果一邊為空,則返回另一邊的頭結點return R;if(R == NULL)return L;ListNode tempL = L, tempR = R; //把左右表頭存儲起來ListNode temp = new SNode, emptyHead = temp; //利用一個空表頭哨兵tempwhile(tempL && tempR) //左右鏈表均不為空的話,進行數據比較{if(tempL->data < tempR->data){temp->pNext = tempL;temp = temp->pNext;tempL = tempL->pNext;}else{temp->pNext = tempR;temp = temp->pNext;tempR = tempR->pNext;}}if(tempL) //如果左邊還有剩余的節點,把其接入鏈表末尾temp->pNext = tempL;if(tempR) //如果右邊還有剩余的節點,把其接入鏈表末尾temp->pNext = tempR;temp = emptyHead->pNext; //實際鏈表數據節點表頭delete emptyHead; //釋放new出來的哨兵emptyHead = NULL;return temp; //返回鏈表數據頭結點 } ListNode divList(ListNode Lhead) {if(Lhead == NULL || Lhead->pNext == NULL) //鏈表長度為0或者1,不用排序return Lhead;ListNode Mid = GetMidNode(Lhead); //獲取鏈表中間節點(如果長度為2,則Mid是第一個節點)ListNode Rhead = Mid->pNext; //右邊鏈表表頭地址Mid->pNext = NULL; //斷開左右鏈表ListNode L = divList(Lhead); //繼續對左右兩條鏈表進行劃分ListNode R = divList(Rhead);return mergeList(L,R); //返回merge后的鏈表的表頭 } ListNode mergeSort(ListNode head) //歸并排序入口,將頭結點地址傳入 {if(head == NULL || head->pNext == NULL) //鏈表長度為0或者1,不用排序return head;elsedivList(head); //長度大于1,則對其進行劃分將鏈表切片 }int main() {srand((unsigned)time(NULL)); //用時間隨機數種子size_t len = 10; //測試鏈表最大長度for(size_t j = 0; j < len; ++j){SingleList intList;for(size_t i = 0; i < j; ++i){intList.AddTail(rand()%100); //添加隨機數到鏈表}cout << "before merge sort: " << endl;intList.PrintList(); //排序前鏈表打印intList.SetHeadNode(mergeSort(intList.GetHeadNode())); //把排序后的鏈表的頭結點設置成鏈表的頭結點cout << "after merge sort: " << endl;intList.PrintList(); //排序后鏈表打印}return 0; }Valgrind檢查結果
總結
以上是生活随笔為你收集整理的数据结构--链表--单链表归并排序mergesort的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钉钉老版本下载3.31_钉钉3.3.1老
- 下一篇: txt文件可存储最大值_Verilog边