快速排序 雙指標

2021-10-05 01:49:37 字數 1200 閱讀 8024

劃分區間,中間有個flag,左邊的數小於a[flag],右邊的數大於a[flag]。注意,雖然左《中 && 中 < 右,但是在左右各自區間可能不是有序的,只是整體小或大而已。

處理左區間,遞迴處理就行。處理右區間,遞迴處理就行。

整體框架,劃分區間函式

/**********************************

* @param a : 待排序陣列

* @param p : 陣列起始位置 (我的是從0開始)

* @param r : 陣列末尾位置

***********************************/

void

quicksort

(int a,

int p,

int r)

}

得到中間flag下標具體函式:

/**********************************

* @param a : 待排序陣列

* @param p : 陣列起始位置 (我的是從0開始)

* @param r : 陣列末尾位置

***********************************/

intpartition

(int a,

int p,

int r)

//死迴圈結束後得到的是第0號位置是中間數,它不應該在第0號位置

swap

(a[p]

,a[j]);

//把中間數交換到j位置,為什麼呢?你看看我們的死迴圈退出條件,位置j上的數一定會小於x,交換過來不就x左小,x右大了嘛

return j;

//返回這個中間下標flag

}

main函式:

#include

#define n 9

using

namespace std;

int a=

;int

main()

return0;

}

執行結果:

快速排序之雙路快速排序

我們知道快排的一般步驟是 1.選取最左邊的數為基準數 2.從右邊開始選取乙個小於基準數的元素 3.從左邊開始選取乙個大於基準數的元素 4.交換這兩個元素 5.重複2 3 4步直至左右兩邊移到同一位置,交換基準數與當前元素 void quick sort int begin,int end left ...

雙路快速排序

雙路快速排序的時間複雜度為o nlog2n 空間複雜度為o n 雙路快速排序的核心思想 單路快排會將等於v的元素分配在左側或者右側,當陣列中有大量重複元素時,這將會導致左右兩側的元素數量極度不均衡,時間複雜度退化到o n 2 如下圖所示 雙路快排是將等於v的部分近乎平均的分配在左右兩側,避免了該問題...

雙路快速排序法

快速排序法的優化 雙路快速排序 上一節我們自己動手寫的乙個快速排序的演算法,在隨機數測試中表現得非常好,然而,我們在用高度有序的陣列進行測試的時候,發現快速排序的效率變得異常的低下,比歸併排序的效率低得多了,近似退回了o n 2 的複雜度,這是為什麼呢?首先讓我們來分析一下歸併排序的演算法思想,歸併...