Partition演算法剖析

2022-03-15 18:58:07 字數 2178 閱讀 1096

對,我是來騙訪問量的!o(∩_∩)o~~

二分partition演算法是我們最常使用的,尤其在快速排序中使用最為常見。常見的partition演算法有如下兩種實現思路:

演算法思路

**
int partition(vector&nums, int begin, int end)

swap(nums[pos], nums[begin]);

return pos;

}

演算法思路
**
int partition(vector&nums, int begin, int end)

nums[begin] = pivot;

return begin;

}

經典的快速排序演算法,直接上**:

**

void quicksort(vector&nums, int begin, int end)

這也是leetcode中的一道例題,非常適合使用partition演算法進行解決,問題鏈結215. kth largest element in an array!

解題思路

**
class solution

else if(pos < len-k)

left = pos+1;

else

right = pos;

}return res;

}int partition(vector&nums, int begin, int end)

nums[begin] = pivot;

return begin;}};

三分partition演算法,顧名思義,也就是將陣列按照規則分為三個部分,比如非常經典的國旗問題dutch national flag problem,就是要給定的紅、白、藍三色隨機顏色小球按照紅、白、藍的順序進行排序,利用partition演算法,使用乙個指標進行掃瞄,紅色的小球就用swap()放到左邊,白色的保持位置不變,藍色的同樣使用swap()放到右邊,最後就得到要求的序列了。

leetcode中有恰好有這麼乙個題:75. sort colors!

解題思路

**
class solution

else}}

};

leetcode 324. wiggle sort ii

leetcode中的第324題中也同樣可以使用三分partition演算法,該題的discuss中,stefanpochmann大神提出一種o(n)+o(1)複雜度的高效演算法,原鏈結為:

324. wiggle sort ii

discuss!

解題思路

#define a(i) nums[(1+2*(i)) % (n|1)]的作用如下所示:

假設有0, 1, 2, 3, 4, 5, 6, 7, 8, 9共10個資料,則使用a()進行對映之後的結果為:

a(0)->nums[1].

a(1)->nums[3].

a(2)->nums[5].

a(3)->nums[7].

a(4)->nums[9].

a(5)->nums[0].

a(6)->nums[2].

a(7)->nums[4].

a(8)->nums[6].

a(9)->nums[8].

**

class solution}};

github:

個人部落格:

Partition演算法記錄

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

Partition演算法詳解

partition演算法有著非常重要的應用,這個演算法的思想雖然簡單,但具體實現的細節卻比較多,今天我重點複習了這個演算法,本文記錄我對這個演算法的理解。二分partition應用 三分partition應用 二分partition 快速排序作為非常著名的排序演算法,其思想卻很簡單 每次從陣列中選乙...

被忽視的 partition 演算法

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