LeetCode:Sort List連結串列排序
阿新 • • 發佈:2019-01-02
=======題目描述=======
題目連結:https://leetcode.com/problems/binary-tree-level-order-traversal/
題目內容:
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0 Output: -1->0->3->4->5
=======演算法實現=======
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: int temp=0; ListNode* getPartition(ListNode* pBegin, ListNode* pEnd){ int key = pBegin->val;//基準元素 ListNode* left = pBegin; ListNode* right = pBegin->next; while(right != pEnd){ //小於基準元素的進行交換 if(right->val < key) { left = left->next; this->temp = right->val; right->val = left->val; left->val = this->temp; } right = right->next; } //交換 this->temp = left->val; left->val = pBegin->val; pBegin->val = this->temp; return left; //返回基準的索引 } void quickSort(ListNode* pBegin, ListNode*pEnd){ if(pBegin != pEnd){ ListNode* partition = getPartition(pBegin, pEnd); //基準的索引 quickSort(pBegin, partition); quickSort(partition->next, pEnd); } } ListNode* sortList(ListNode* head) { quickSort(head, nullptr); return head; } };
=======演算法筆記*排序演算法=======
快速排序(Quick Sort)
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n個元素要O(nlogn)次比較。在最壞狀況下則需要O(n^2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他O(nlogn)演算法更快,因為它的內部迴圈可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治策略(Divide and Conquer)來把一個序列分為兩個子序列。步驟為:
- 從序列中挑出一個元素,作為"基準"(pivot).
- 把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的後面(相同的數可以到任一邊),這個稱為分割槽(partition)操作。
- 對每個分割槽遞迴地進行步驟1~2,遞迴的結束條件是序列的大小是0或1,這時整體已經被排好序了。
使用快速排序法對一列數字進行排序的過程:
快速排序是不穩定的排序演算法,不穩定發生在基準元素與A[tail+1]交換的時刻。
比如序列:{ 1, 3, 4, 2, 8, 9, 8, 7, 5 },基準元素是5,一次劃分操作後5要和第一個8進行交換,從而改變了兩個元素8的相對次序。
之前總結整理的:
常用排序演算法總結
https://blog.csdn.net/qq_42189368/article/details/84023271
內容目錄:
氣泡排序(Bubble Sort)
氣泡排序的改進:雞尾酒排序
選擇排序(Selection Sort)
插入排序(Insertion Sort)
插入排序的改進:二分插入排序
插入排序的更高效改進:希爾排序(Shell Sort)
歸併排序(Merge Sort)
快速排序(Quick Sort)