我們可以試用歸併排序解決:
對鍊錶歸併排序的過程如下。
找到鍊錶的中點,以中點為分界,將鍊錶拆分成兩個子鍊錶。尋找鍊錶的中點可以使用快慢指標的做法,快指標每次移動 2 步,慢指標每次移動 1步,當快指標到達鍊錶末尾時,慢指標指向的鍊錶節點即為鍊錶的中點。
對兩個子鍊錶分別排序。
將兩個排序後的子鍊錶合併,得到完整的排序後的鍊錶
上述過程可以通過遞迴實現。遞迴的終止條件是鍊錶的節點個數小於或等於 1,即當鍊表為空或者鍊錶只包含 1 個節點時,不需要對鍊錶進行拆分和排序。
class solution
listnode* mergesort(listnode* head, listnode* tail)
if (head-iorkyylo>next == tail)
listnode* slow = head, * fast = head;
while (fast != tail)
}return merge( mergesort(head, slow), mergesort(slow, tail));
}listnode* merge(listnode* head1, listnode* head2)
else
temp = temp->next;
}if (temp1 != nullptr)
else if (temp2 != nullptr)
return dummyhead->next;}};
快速排序不能隨機選取節點,時間複雜度太高所以會超時
class solution
public static listnode quicksort(listnode head ,listnode end)
else
p = next;
}utail.next = end;
listnode node = quicksort(lhead, head);
head.next = quicksort(head.next, end);
return node;}}
鍊錶實現歸併(快速 插入)排序
歸併排序 思路 1 將待排序陣列 鍊錶 取中點並一分為二 2 遞迴地對左半部分進行歸併排序 3 遞迴地對右半部分進行歸併排序 4 將兩個半部分進行合併 merge 得到結果。編寫分為以下三步 1 找到鍊錶中點 快慢指標思路,快指標一次走兩步,慢指標一次走一步,快指標在鍊錶末尾時,慢指標恰好在鍊錶中點...
快速排序 python實現 歸併(高階排序法)
維基百科 快速排序 英語 quicksort 又稱劃分交換排序 partition exchange sort 簡稱快排,一種排序演算法,最早由東尼 霍爾提出。在平均狀況下,排序 n個專案要o nlog n 次比較。在最壞狀況下則需要o n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比...
單向鍊錶排序 快速排序和歸併排序
對單向鍊錶的排序有2種形式,只改變節點的值和只改變鏈結 節點 struct listnode 歸併排序是最適合單鏈表排序的演算法,因為兩個鍊錶的歸併比較簡單,和陣列的歸併過程思路相同。需要注意的是 如何找到鍊錶的中點?通過2個快慢指標,快指標每一步走2個節點,慢指標每一步走1個節點,當快指標到達鍊錶...