C 歸併法 快速排序實現鍊錶排序的方法

2022-10-03 15:24:14 字數 1040 閱讀 4776

我們可以試用歸併排序解決:

對鍊錶歸併排序的過程如下。

找到鍊錶的中點,以中點為分界,將鍊錶拆分成兩個子鍊錶。尋找鍊錶的中點可以使用快慢指標的做法,快指標每次移動 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個節點,當快指標到達鍊錶...