1. 程式人生 > >LeetCode:Sort List連結串列排序

LeetCode:Sort List連結串列排序

=======題目描述=======

題目連結: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)來把一個序列分為兩個子序列。步驟為:

  1. 從序列中挑出一個元素,作為"基準"(pivot).
  2. 把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的後面(相同的數可以到任一邊),這個稱為分割槽(partition)操作。
  3. 對每個分割槽遞迴地進行步驟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)