二 、歸併排序
快速排序(英語:quicksort),又稱分割槽交換排序
(partition-exchange sort),簡稱快排
,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序n個專案要o(n\log n)(大o符號)次比較。在最壞狀況下則需要 o(n2)次比較,但這種狀況並不常見。事實上,快速排序
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為較小和較大的2個子序列,然後遞迴地排序兩個子串行。步驟為:
挑選基準值:從數列中挑出乙個元素,稱為「基準」(pivot),分割:重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(與基準值相等的數可以到任何一邊)。在這個分割結束之後,對基準值的排序就已經完成,
遞迴排序子串行:遞迴地將小於基準值元素的子串行和大於基準值元素的子串行排序。
遞迴到最底部的判斷條件是數列的大小是零或一,此時該數列顯然已經有序。
選取基準值有數種具體方法,此選取方法對排序的時間效能有決定性影響。
#include
using
namespace std;
const
int n =
1e6+10;
int q[n]
;int n;
void
quick_sort
(int q,
int l,
int r)
quick_sort
(q,l,j)
;quick_sort
(q,j+
1,r);}
int main (
)
歸併排序
(英語:merge sort,或mergesort),是建立在歸併操作上的一種有效的排序演算法,效率為 o(n\log n)(大o符號)。2023年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行。
歸併操作(merge),也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依賴歸併操作。
遞迴法(top-down):
1.申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列2.設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3.比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4.重複步驟3直到某一指標到達序列尾
將另一串行剩下的所有元素直接複製到合併序列尾
#include
using
namespace std;
const
int n =
1e6+10;
int q[n]
,n,tmp[n]
;void
merge_sort
(int q,
int l,
int r)
int main (
)
快排 歸併排序
二 歸併排序 遞迴 分治的思維 分治 確定分界點 我們下面以中間值q l r 1 為分界點,理論上任何點作為分界點都可 調整區間 x 的在左邊,x的在右邊 兩個區間 遞迴 遞迴處理左右兩段 原題鏈結 題目描述 給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的...
單鏈表排序 快排 歸併排序
題目描述 給定乙個亂序的單鏈表的頭節點,對該鍊錶中的節點進行排序 要求時間複雜度為o nlgn 空間複雜度為o 1 分析 由於題目要求時間複雜度我o nlgn 因此選擇排序和插入排序可以排除。在排序演算法中,時間複雜度為o nlgn 的主要有 歸併排序 快速排序 堆排序。其中堆排序的空間複雜度為 n...
單鏈表排序 快排 歸併排序
題目描述 給定乙個亂序的單鏈表的頭節點,對該鍊錶中的節點進行排序 要求時間複雜度為o nlgn 空間複雜度為o 1 分析 由於題目要求時間複雜度我o nlgn 因此選擇排序和插入排序可以排除。在排序演算法中,時間複雜度為o nlgn 的主要有 歸併排序 快速排序 堆排序。其中堆排序的空間複雜度為 n...