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...