C 快速排序(快排) 歸併排序

2021-10-06 15:25:37 字數 1715 閱讀 5392

二 、歸併排序

快速排序(英語: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...