常見演算法溫習之快速排序

2021-07-26 20:37:32 字數 1006 閱讀 7823

部落格內容中的排序以公升序排列為例

1. 演算法理解

快排的基本思想是:

1.1 選取pivot

通常不加考慮地可以直接選取序列的第乙個元素作為pivot,但是極端情況下,當原始序列恰好以降序排列時,快排時間複雜度將達到o(n^2)。比較好的方法是「三數中值分割法」,即選取序列的第0個、最後乙個和最中間乙個這三個元素,按照公升序排列(left, center, right),選取中值(center)作為pivot,這樣可以一定程式上緩解上述「壞情況」。

1.2 分割策略

快排可以通俗理解為「挖坑」和「填坑」的過程。

2. c++實現

#include 

using

namespace

std;

void swap(int *pa, int *pb)

int median3(int a, int left, int center, int right)

void quicksort(int a, int left, int right)

a[i] = pivot;

quicksort(a, left, i-1);

quicksort(a, i+1, right);

}int main()

3. 演算法複雜度分析

最優情況下,集合s1和s2的元素數目每次都比較均勻,則時間複雜度為o(nlogn),最壞情況上面已經分析過,平均情況下是o(nlogn),分析過程可參照二叉樹。

就空間複雜度來說,主要是遞迴造成的棧空間的呼叫,最好情況下遞迴樹的深度為log2n,其空間複雜度也就為o(logn),最壞情況,需要進行n‐1遞迴呼叫,其空間複雜度為o(n),平均情況,空間複雜度也為o(logn)。

參考:

1. 《資料結構與演算法分析——c語言描述》

2.

常見排序演算法之快速排序

思想 找乙個記錄,以它的關鍵字作為 樞軸 凡其關鍵字小於樞軸的記錄均移動至該記錄之前,反之,凡關鍵字大於樞軸的記錄均移動至該記錄之後。致使一趟排序之後,記錄的無序序列 r s.t 將分割成兩部分 r s.i 1 和r i 1.t 且 r j key r i key r j key s j i 1 樞...

常見排序演算法之快速排序

快速排序是一種分割槽交換排序,是目前已知實測最快的一種排序演算法.6.快速排序 演算法思想 快速排序的基本思想是,通過一趟劃分將陣列或線性表劃為左部,右部,和基準值.其中左部都比基準值小,右部都比基準值大.1 在陣列中選擇乙個樞紐元key,一般情況下選取第乙個資料 2 將所有比key值小的資料移到k...

常見演算法之18 快速排序

快速排序基本思想 選定乙個中樞元素,以其為基準點,將小於它的數放在其前面,大於其的數放在後面,把中樞元素放在最終合適的位置。然後再對左右兩邊分別遞迴。快速排序的基本步驟 1 初始時,以第乙個元素作為中樞元素。低指標指向第乙個元素,高指標指向最後乙個元素。2 當中樞元素在低指標時,從高指標開始向前查詢...