๐ ํต์ ๋ ฌ
ํต์ ๋ ฌ์ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ง ๊ทธ๋๋ก ๋น ๋ฅธ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค. ํต ์ ๋ ฌ๋ ๋ณํฉ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถํ ์ ๋ณต๊ธฐ๋ฒ์ ์ด์ฉํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํต ์ ๋ ฌ์ ํต์ฌ ์์ด๋์ด๋ ํน์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํน์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๊ฐ ๊ฒฐ์ ๋๋ฉฐ ๋ถ๋ฅ๋ ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ ์์์ ๊ฐ๊ฐ ๊ธฐ์ค ์์๋ฅผ ๋ค์ ์ ํด ์ฌ๊ท์ ์ผ๋ก ์ชผ๊ฐ๋๊ฐ๋ฉด์ ์ ๋ ฌํด๋๊ฐ๋ค. ๋ณํฉ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จ์๋ฅผ ์ชผ๊ฐ๋๊ฐ๋ ์์ด๋์ด์ด๋ฏ๋ก ๋ถํ ์ ๋ณต๊ธฐ๋ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด๋ ์๊ฐํด๋ด์ผ ํ ๊ฒ์ ๊ธฐ์ค์ด ๋๋ ์์(pivot)๋ฅผ ์ด๋ป๊ฒ ์ ํ๋๋ ์ธ๋ฐ,
1) ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ฑฐ๋
2) ๋๋ค์ผ๋ก ์์๋ฅผ ์ ํํ๋ค
์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ๊ฒฝ์ฐ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ ํผ๋ด์ ํ์ชฝ์๋ง ์์๊ฐ ๋ชฐ๋ ค์์ด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์์๋ก ์์๋ฅผ ์ ํํ๋ค. c++์์๋ <random> ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ random_device๋ฅผ ์ฌ์ฉํด ์ค๋ณต์์ด ๋๋ค๊ฐ์ ๋ฝ์๋ผ ์ ์๋ค. (C์ rand์ ๋นํด ๋ซ๋ค๊ณ ํ๋๋ฐ ์ ๋ชจ๋ฅด๊ฒ ๋ค)
์ฌ์ด ๊ตฌํ์ ์ํด ๋๋ค๊ฐ์ด ๋ฆฌ์คํธ์์์ ํผ๋ด ์ธ๋ฑ์ค์ด๋ฉฐ, ๊ทธ ํผ๋ด ๊ฐ์ ๋ฐ๋ก ์ธ๋ฑ์ฑํด ๊ตฌํด๋๋๋ค.
// ๊ธฐ์ค์ด ๋ pivot ๊ฐ ๋๋ค์ผ๋ก ์ ํจ
random_device rd;
mt19937_64 random(rd());
uniform_int_distribution<int> range(0, L.size() - 1);
int index = range(random);
int pivot = L[index];
์ดํ ๊ธฐ์ค ์์๋ฅผ ์ค์ฌ์ผ๋ก ์์ ๊ฒ์ ์ผ์ชฝ์, ํฐ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์น๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ฉฐ, ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ถ๋ฅ๋ ์์๋ค ๋ด์์ ๋ ๋ค์ ํต์ ๋ ฌ์ ์ ์ฉํด ์์ ๋จ์๋ก ๋ถํ ํด(divide)๋๊ฐ๋ค. ๋ณํฉ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Divide-Delegate-Combine ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
// pivot๊ฐ์ ์ ์ธํ ๋ฒกํฐ๋ฅผ left, right์ผ๋ก ๋๋
L.erase(L.begin() + index);
vector<int> left, right;
for (int i = 0; i < L.size(); i++) {
if (L[i] > pivot) {
right.push_back(L[i]);
}
else {
left.push_back(L[i]);
}
}
// left, right์ ํต์ ๋ ฌ ์ฌ๊ท ์ ์ฉ
vector<int> p = quicksort(left);
vector<int> q = quicksort(right);
vector<int> target = p;
target.push_back(pivot);
target.insert(end(target), begin(q), end(q));
๐์๊ฐ๋ณต์ก๋
ํต์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๋ ๋ณํฉ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก nlogn ์๊ฐ์ ๊ฐ์ง๋ค. ์ต์ ์ ๊ฒฝ์ฐ ๊ธฐ์ค ์์์ ํ์ชฝ์๋ง ์์๊ฐ ์ ๋ฆฌ๋ฉด O(n^2) ์๊ฐ๋ ๊ฐ๋ฅํ์ง๋ง ํ๊ท ์ ์ผ๋ก๋ nlogn ์๊ฐ์ด๋ค. ๋ณํฉ์ ๋ ฌ์ ์ธ์ ๋ nlogn ์๊ฐ์ ๋ณด์ฅํ๋ค๋ ์ ์์ ์ฅ๋จ์ ์ด ์๋ค.
merge sort์ quick sort๋ ๋ชจ๋ ๋ถํ ์ ๋ณต๊ธฐ๋ฒ! ์ด๊ฒ๋ง ๊ธฐ์ตํ๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค
'Problem Solving > Algorithm, DS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๊ธฐ์์ ๋ ฌ, ๊ณ์์ ๋ ฌ Radix, Counting Sort (C++ ๊ตฌํ) (0) | 2021.01.04 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ํ ์ ๋ ฌ Heap Sort (C++ ๊ตฌํ, make_heap, pop_heap) (0) | 2021.01.03 |
[์๊ณ ๋ฆฌ์ฆ] ๋ณํฉ์ ๋ ฌ Merge Sort (C++ ๊ตฌํ) (0) | 2021.01.02 |
[์๊ณ ๋ฆฌ์ฆ] ์ฝ์ ์ ๋ ฌ Insertion Sort (C++ ๊ตฌํ) (0) | 2020.12.31 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฒ๋ธ์ ๋ ฌ Bubble Sort (C++ ๊ตฌํ) (0) | 2020.12.30 |