看到這篇標題,沒有學過快排的人自然是不知道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,...