C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法
本文主要介紹了C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法,分享給大家,具體如下:
我們可以試用歸并排序解決:
對鏈表歸并排序的過程如下。
找到鏈表的中點(diǎn),以中點(diǎn)為分界,將鏈表拆分成兩個子鏈表。尋找鏈表的中點(diǎn)可以使用快慢指針的做法,快指針每次移動 2 步,慢指針每次移動 1步,當(dāng)快指針到達(dá)鏈表末尾時,慢指針指向的鏈表節(jié)點(diǎn)即為鏈表的中點(diǎn)。
對兩個子鏈表分別排序。
將兩個排序后的子鏈表合并,得到完整的排序后的鏈表
上述過程可以通過遞歸實(shí)現(xiàn)。遞歸的終止條件是鏈表的節(jié)點(diǎn)個數(shù)小于或等于 1,即當(dāng)鏈表為空或者鏈表只包含 1 個節(jié)點(diǎn)時,不需要對鏈表進(jìn)行拆分和排序。
class Solution { public: ListNode* sortList(ListNode* head) { return sortList(head, nullptr); } ListNode* mergesort(ListNode* head, ListNode* tail) { if (head == nullptr) { return head; } if (head->next == tail) { head->next = nullptr; return head; } ListNode* slow = head, * fast = head; while (fast != tail) { slow = slow->next; fast = fast->next; if (fast != tail) { fast = fast->next; } } return merge( mergesort(head, slow), mergesort(slow, tail)); } ListNode* merge(ListNode* head1, ListNode* head2) { ListNode* dummyHead = new ListNode(0); ListNode* temp = dummyHead, * temp1 = head1, * temp2 = head2; while (temp1 != nullptr && temp2 != nullptr) { if (temp1->val <= temp2->val) { temp->next = temp1; temp1 = temp1->next; } else { temp->next = temp2; temp2 = temp2->next; } temp = temp->next; } if (temp1 != nullptr) { temp->next = temp1; } else if (temp2 != nullptr) { temp->next = temp2; } return dummyHead->next; } };
快速排序不能隨機(jī)選取節(jié)點(diǎn),時間復(fù)雜度太高所以會超時
class Solution { public static ListNode sortList(ListNode head) { return quickSort(head ,null); } public static ListNode quickSort(ListNode head ,ListNode end){ if(head ==end || head.next ==end) return head; ListNode lhead = head ,utail = head ,p = head.next; while (p != end){ ListNode next = p.next; if(p.val < head.val){//頭插 p.next = lhead; lhead = p; } else { //尾插 utail.next = p; utail = p; } p = next; } utail.next = end; ListNode node = quickSort(lhead, head); head.next = quickSort(head.next, end); return node; } }
到此這篇關(guān)于C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法的文章就介紹到這了,更多相關(guān)C++ 鏈表排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中的while循環(huán)和for循環(huán)語句學(xué)習(xí)教程
這篇文章主要介紹了C++中的while循環(huán)和for循環(huán)語句學(xué)習(xí)教程,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法
這篇文章主要介紹了VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C++深入詳解單例模式與特殊類設(shè)計(jì)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++單例模式和特殊類的設(shè)計(jì),單例模式這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-06-06C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08關(guān)于memcpy和memmove的一點(diǎn)重要說明
下面小編就為大家?guī)硪黄P(guān)于memcpy和memmove的一點(diǎn)重要說明。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12