快排光芒下被忽視的Partition函式

2021-07-24 07:26:29 字數 1847 閱讀 6846

看到這篇標題,沒有學過快排的人自然是不知道partition函式的意思和作用,這裡附上學習的連線

lantian的快排總結

我們現在都是被快排蒙蔽了雙眼,沒有意識到快最核心的劃分函式partition,當然partition函式也就不止於快排這裡,本文就從多方面來為展示partition函式的本質和擴充套件作用

在演算法導論中我們對partition函式的定義是這樣的:

partition(a, p, r)

x = a[r]

//選擇最後乙個元素作為比較元素

i = p –1

//這個慢速移動下標必須設定為比最小下表p小

1,否則兩個元素的序列比如2,

1無法交換

for 

j = 

p to 

r-1//

遍歷每個元素

}exchange 

a[i+1] 

with 

a[r]

//交換

return 

i + 1//

返回分割點

這裡我就不再過多的贅述演算法的具體細節,我在這裡強調的是對快排中的partition的優化

首先,在原本的演算法中,假如我們已經選定了乙個樞紐元,那麼對於所有的比樞紐元小的元素我們都執行了swap操作

這是非常的低效的

在這裡我們引入雙向的partition演算法,在雙向的演算法中,我們對於比樞紐院小的元素並不是都執行了swap操作,只有陣列右邊的一部分的比樞紐元小的元素我們才執行了swap操作,大大減少了swap操作的次數從而降低時間複雜度

含有partition函式的快速排序,標準演算法導論上的描述實現

#include"iostream"

#include"cstdio"

#include"cstring"

#include"cstdlib"

#define n 1005

using namespace std;

int data[n];

int number;

void init_data() }

void print()

void init_data()

{ scanf("%d%d",&number,&k);

for(int i=0;i=right) return ;

else

{ int i=left-1;

int j=left;

int var=data[right];

while(j荷蘭三色旗問題,這種問題是用partition的典型例子

定義乙個陣列序列有紅白藍三種顏色,我們要求盡可能快的對陣列進行排序,是的相同顏色的元素相鄰,並且整體存在紅白藍額順序

本題是partition函式的擴充套件應用,時間複雜度和空間複雜度處理的非常的優秀

演算法詳見:

leetcode-75

/*partiton函式的作用

簡易模擬 dutch national flag problem */

#include"iostream"

#include"cstdio"

#include"cstring"

#include"cstdlib"

#define n 1005

using namespace std;

//0<1<2為例

int data[n];

int number;

void init_data()

{ scanf("%d",&number);

for(int i=0;ipartition函式真的是非常的強大,我們如果只是了解快排的話真的是沒有學透partition函式的精髓,也沒有學到快排的演算法的本質

被忽視的 partition 演算法

如果你學習過演算法,那麼肯定聽說過快速排序的大名,但是對於快速排序中用到的 partition 演算法,你了解的夠多嗎?或許是快速排序太過於光芒四射,使得我們往往會忽視掉同樣重要的 partition 演算法。partition 可不只用在快速排序中,還可以用於 selection algorith...

被忽視的 partition 演算法

如果你學習過演算法,那麼肯定聽說過快速排序的大名,但是對於快速排序中用到的 partition 演算法,你了解的夠多嗎?或許是快速排序太過於光芒四射,使得我們往往會忽視掉同樣重要的 partition 演算法。partition 可不只用在快速排序中,還可以用於 selection algorith...

快排的兩種partition函式

partition函式就是快排的關鍵部分,作用是將陣列劃分成兩部分,左邊小於基數,右邊大於基數 但實際上它也不僅僅用於快排,在求top k 問題中也常常會用到。下面介紹兩種partition函式,他們都是雙指標的方法,但具體會有差異 函式一 頭尾指標向中間夾 def partition array,...