鍊錶的快排 歸併排序

2021-09-25 02:29:27 字數 1113 閱讀 8566

leetcode 148、排序鍊錶

在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

示例 1:

輸入: 4->2->1->3

輸出: 1->2->3->4

示例 2:

輸入: -1->5->3->4->0

輸出: -1->0->3->4->5

歸併法:

不斷遞迴下去,最後再合併,合併有序鍊錶,建立dummy結點的技巧。

class solution 

fast = slow->next;

slow->next = null;

listnode* p = sortlist(head);

listnode* q = sortlist(fast);

return merge_list(p,q);

}listnode* merge_list(listnode*l1,listnode*l2)

else

cur = cur->next;

}if(l1)

if(l2)

return dummy->next;

}};

快排法:

如何在鍊錶中寫出partition函式?建立的tail指標其實沒用的,因為我們是從前往後遍歷,找到乙個比pivot小的就挪動,動態的去維護了已分割鍊錶s,所以每次找到乙個數字大於pivot,s向後挪動一位再交換,因為包含s即以前都是分割好的鍊錶。最後要把s和head的val交換一下,這樣才把pivot放到了軸的位置,把鍊錶進行了分割。

class solution 

void quicksort(listnode* head,listnode* tail)

listnode* patiation(listnode* head,listnode* tail)

cur = cur->next;

}swap(head,s);

return s;

}void swap(listnode* n1,listnode* n2)

};

快排 歸併排序

二 歸併排序 遞迴 分治的思維 分治 確定分界點 我們下面以中間值q l r 1 為分界點,理論上任何點作為分界點都可 調整區間 x 的在左邊,x的在右邊 兩個區間 遞迴 遞迴處理左右兩段 原題鏈結 題目描述 給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的...

快排和歸併排序講解

快速排序 歸併排序 找陣列的最後乙個數字,假設為number,然後number為標準,調整陣列 陣列左邊是小於number的數,中間是等於number的數,右邊是大於number的數,然後對小於number的部分繼續進行上述操作,對大於number的部分繼續進行上述操作。這是普通的快速排序,和資料的...

演算法 歸併排序與快排

歸併排序是另一種不同的排序方法,因為歸併排序使用了遞迴分治的思想,所以理解起來比較容易。其基本思想是,先遞迴劃分子問題,然後合併結果。把待排序列看成由兩個有序的子串行,然後合併兩個子串行,然後把子序列看成由兩個有序序列。倒著來看,其實就是先兩兩合併,然後四四合併。最終形成有序序列。空間複雜度為o n...