對,我是來騙訪問量的!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...