Partition演算法詳解

2021-10-09 02:21:08 字數 2264 閱讀 5227

partition演算法有著非常重要的應用,這個演算法的思想雖然簡單,但具體實現的細節卻比較多,今天我重點複習了這個演算法,本文記錄我對這個演算法的理解。

二分partition應用

三分partition應用

二分partition

快速排序作為非常著名的排序演算法,其思想卻很簡單:每次從陣列中選乙個數作為pivot,然後將陣列劃分為2部分,小於等於pivot數的在其左邊,大於等於pivot的數在其右邊,然後分別對pivot的左邊和右邊進行遞迴。

二分partition的實現用到了雙指標,left尋找乙個比pivot大的數,right尋找乙個比pivot小的數,然後交換它們,迴圈這一過程直到left == right,將pivot放到這個位置。

注意:如果pivot選的是最左的元素,則要先移動right;如果pivot選的是最右的元素,則要先移動left。

int

partition

(vector<

int>

& nums,

int left,

int right)

nums[base]

= nums[left]

; nums[left]

= pivot;

return left;

}

三分partition

三分partition自然就是把陣列劃分成3部分,小於pivot的在左邊,等於pivot的在中間,大於pivot的在右邊。

由於三分partition要保證中間的那部分,所以像二分partition那麼劃分是肯定不行的。為了解決這個問題,我們需要先定義迴圈不變數

我們用curr來遍歷陣列,遍歷的範圍是[0, two]。在整個遍歷過程中,始終要保證迴圈不變數的正確,因此,當遇到0時,要與nums[zero]交換,遇到2時,要與nums[two]交換。

細節:每次交換時,邊界zero或者two自然是要相應地進行移動,那麼curr呢?

初始化:初始化要保證除了[curr, two]外的3個區間都為空

我們以leetcode第215題:找陣列中的第k個最大元素為例來說明二分partition演算法在快速排序中的應用。

這道題雖然不是直接讓我們進行快速排序,但我們可以想到,每次partition之後都會返回pivot最終在陣列中的位置mid,如果mid就是要找的位置,那就不用再繼續遞迴partition下去了,答案已經找到;否則,繼續在mid的左邊或者右邊進行遞迴partition。

時間複雜度

快速排序的時間複雜度跟選取的pivot有關,如果每次都選最左邊的作為pivot,而它剛好又是陣列中最小的元素,那麼這次partition需要遍歷完整個陣列,即遍歷n次;接著遞迴右部分(有n-1個元素),如果同樣最左邊的是最小的,那麼需要遍歷n-1次…

如果每次都將陣列劃分成1和n-1兩部分,每次又繼續遞迴n-1的那部分,那麼就會導致快排的最差時間複雜度:o(n

2)

o(n^2)

o(n2)。

為了改善這種情況,可以隨機選取pivot

**

class solution 

else

}return nums[mid];}

private:

intpartition

(vector<

int>

& nums,

int left,

int right)

nums[base]

= nums[left]

; nums[left]

= pivot;

return left;

}void

swap

(int

& num1,

int& num2)

};

leetcode第75題:顏色分類就是一道典型的三分partition應用題。

**

class solution 

}private:

void

swap

(int

& num1,

int& num2)

};

Partition演算法記錄

被忽視的 partition 演算法 首先以無序陣列中的元素為樞軸點 pivot,經過一次遍歷,將陣列中其他元素分為以 pivot 為分界線的兩部分,使得左邊部分的數小於等於pivot,右邊部分的數大於等於pivot 左部分或者右部分都可能為空 最後返回pivot在新的陣列中的位置。指標單向遍歷 以...

Partition演算法剖析

對,我是來騙訪問量的!o o 二分partition演算法是我們最常使用的,尤其在快速排序中使用最為常見。常見的partition演算法有如下兩種實現思路 演算法思路 int partition vector nums,int begin,int end swap nums pos nums beg...

Hive分割槽partition詳解

請看原文作者的部落格 我補充的是 外部表的分割槽 create external table t2 id int name string hobby array,add map partitioned by pt d string row format delimited fields termin...