์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ์ ๋ ฌ
- ์๊ณ ๋ฆฌ์ฆ
- ์ฐ์ ์์ํ
- ๋์ ๊ณํ๋ฒ
- SQL
- LIS
- ์๋ฃ๊ตฌ์กฐ
- ๋์ ํฉ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๋๋น์ฐ์ ํ์
- BFS
- ์์๊ตฌํ๊ธฐ
- ๊ทธ๋ํํ์
- ๋จธ์ง์ํธ
- DP
- ํ์ด์ฌ
- ์์ํ์
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- ๊ทธ๋ํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋ณํฉ์ ๋ ฌ
- ์ค๋ธ์
- DFS
- ๊ตฌํ
- ์ํ
- db
- ๋ฐฑ์ค
- ๊น์ด์ฐ์ ํ์
- ๊ทธ๋ฆฌ๋
๐๐ญ๐ฐ๐ธ ๐ฃ๐ถ๐ต ๐ด๐ต๐ฆ๐ข๐ฅ๐บ
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ - 2. ํต ์ ๋ ฌ(Quick Sort) ๋ณธ๋ฌธ
2. ํต ์ ๋ ฌ ; Quick Sort
2.1 ๊ฐ๋
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ์ ๋ ฌ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ๋ณํฉ ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฒด ์งํฉ์ ์์ ํฌ๊ธฐ์ ๋ถ๋ถ์งํฉ์ผ๋ก ๋๋์ด ์ ๋ ฌ์ ์ํํ ๋ค ๋ค์ ํฉ์น๋ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค. ๋ณํฉ ์ ๋ ฌ์ ํต์ฌ ์ฐ์ฐ์ ๋ณํฉ์ธ ๋ฐ ๋นํด ํต ์ ๋ ฌ์ ํต์ฌ ์ฐ์ฐ์ ๋ถํ ์ด๋ค. ํต ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์งํ๋๋ค.
1. ๋ถํ (Divide) : ์ ๋ ฌํ ์งํฉ์ ๊ธฐ์ค๊ฐ์ ์ค์ฌ์ผ๋ก ๋ ๋ถ๋ถ์งํฉ์ผ๋ก ๋ถํ
2. ์ ๋ณต(Conquer) : ๋ถ๋ถ์งํฉ ๋ด์์ ๊ธฐ์ค๊ฐ์ ์ ๋ ฌ ์์น ์ ์
์ด ๋ ์ฌ์ฉํ๋ ๊ธฐ์ค๊ฐ์ ํผ๋ด(Pivot) ์ด๋ผ๊ณ ํ๋๋ฐ, ์ฒซ ๋ฒ์งธ ์์ / ๋ง์ง๋ง ์์ / ๊ฐ์ด๋ฐ ์์ ๋ฑ ์์์ ์์์ ๊ฐ์ ์ ํ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ์ ํ ๊ธฐ์ค๊ฐ์ ์ค์ฌ์ผ๋ก ์ผ์ชฝ(L)๊ณผ ์ค๋ฅธ์ชฝ(R) ๋ถ๋ถ์งํฉ์ผ๋ก ๋๋์ด ์ ๋ ฌํ๋ค. ํต ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- ์ผ์ชฝ ๋์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ด๋ฉด์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ ํผ๋ด๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์๋ฅผ ์ฐพ์ L๋ก ํ์ํ๋ค. ๋จ, L์ R๊ณผ ๋ง๋๋ฉด ๋ ์ด์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ์ง ๋ชปํ๊ณ ๋ฉ์ถ๋ค.
- ์ค๋ฅธ์ชฝ ๋์์ ์ผ์ชฝ์ผ๋ก ์์ง์ด๋ฉด์ ํผ๋ด๋ณด๋ค ์์ ์์๋ฅผ ์ฐพ์ R๋ก ํ์ํ๋ค. ๋จ, R์ L๊ณผ ๋ง๋๋ฉด ๋ ์ด์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ์ง ๋ชปํ๊ณ ๋ฉ์ถ๋ค.
- 1๊ณผ 2์์ ์ฐพ์ L ์์์ R ์์๊ฐ ์์ ๊ฒฝ์ฐ ๊ฐ์ ๋น๊ตํ ํ ์๋ก ๊ตํํ๊ณ L๊ณผ R์ ํ์ฌ ์์น์์ 1๊ณผ 2 ์์ ์ ๋ค์ ์ํํ๋ค.
- 1 ~ 2๋ฅผ ์ํํ๋ฉด์ L๊ณผ R์ด ๊ฐ์ ์์์์ ๋ง๋ ๋ฉ์ถ ๊ฒฝ์ฐ ํผ๋ด๊ณผ R์ ์์์ ๊ฐ์ ๋น๊ตํ ๋ค ์๋ก ๊ตํํ๋ค. ๊ตํ๋ ์๋ฆฌ๋ฅผ ํผ๋ด ์์น๋ก ํ์ ํ๊ณ ํ์ฌ ๋จ๊ณ์ ํต ์ ๋ ฌ์ ๋๋ธ๋ค.
- ํผ๋ด์ ํ์ ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ง ์๋ก์ด ์ผ์ชฝ ๋ถ๋ถ์งํฉ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์งํฉ์ ๋ํด์ 1~3(4)์ ํต ์ ๋ ฌ์ ์ํ์ ์ผ๋ก ๋ฐ๋ณต ์ํํ๋, ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ํฌ๊ธฐ๊ฐ 1 ์ดํ๊ฐ ๋๋ฉด ์ ์ฒด ํต ์ ๋ ฌ์ ์ข ๋ฃํ๋ค.
๊ทธ๋ฆผ๊ณผ ํจ๊ป ์ดํดํด๋ณด๋๋ก ํ์.
์ ๋ ฌ๋์ง ์์ ์งํฉ A๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด์๋ค.
A = { 3, 8, 7, 2, 5, 1, 4, 6 }
์งํฉ A๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค๊ณ ๊ฐ์ ์ ํด๋ณด์. ํต ์ ๋ ฌํ๋ ๊ณผ์ ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค. ์ด ๋, ํผ๋ด์ ๊ฐ์ด๋ฐ ์์๋ก ์ค์ ํ๋ค.
1๋จ๊ณ : L์ ํผ๋ด ๊ฐ์ธ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์๋ฅผ ๋ง๋ ๋ ๊น์ง ์ด๋ํ๊ณ , R์ 2๋ณด๋ค ์์ ์์๋ฅผ ๋ง๋ ๋ ๊น์ง ์ด๋ํ๋ค. L๊ณผ R์ด ๊ฐ๋ฆฌํค๋ ์์์ ๊ฐ์ ๋น๊ตํ์์ ๋ 3์ด 1๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ๋ ์๋ฆฌ๋ฅผ ๊ตํํ๋ค. ๋ค์ L์ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์๋ฅผ ๋ง๋ ๋ ๊น์ง ์ด๋ํ๊ณ , R์ 2๋ณด๋ค ์์ ์์๋ฅผ ๋ง๋ ๋ ๊น์ง ์ด๋ํ๋ค. ์ด ๋, L๊ณผ R์ด ๋ง๋ ๋ฉ์ท๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅดํค๋ ๊ฐ๊ณผ ํผ๋ด์ ๊ฐ์ ๋น๊ตํ๊ณ , 2๊ฐ 8๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ ๋ ์๋ฆฌ๋ฅผ ๊ตํํ๋ค. ๋ ์ด์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ํผ๋ด์ด์๋ 2์ ์์น๋ฅผ ํ์ ํ๋ค.
2๋จ๊ณ : ์ผ์ชฝ ๋ถ๋ถ์งํฉ์ ํฌ๊ธฐ๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ์ ํ์ง ์๊ณ , ์ค๋ฅธ์ชฝ ๋ถ๋ถ์งํฉ๋ง ํต ์ ๋ ฌ์ ์คํํ๋ค. L์ ํผ๋ด ๊ฐ์ธ 5๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์๋ฅผ ๋ง๋ ๋ ๊น์ง ์ด๋ํ๊ณ , R์ 5๋ณด๋ค ์์ ์์๋ฅผ ๋ง๋ ๋ ๊น์ง ์ด๋ํ๋ค. L๊ณผ R์ด ๊ฐ๋ฆฌํค๋ ์์์ ๊ฐ์ ๋น๊ตํ์์ ๋ 7์ด 4๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ์๋ฆฌ๋ฅผ ๊ตํํ๋ค. ๋ค์ L๊ณผ R์ ์ด๋์ํจ ๋ค, ๋ฉ์ถ ์๋ฆฌ์์ ๊ฐ์ ์๋ก ๋น๊ตํ๋ค. 8๋ณด๋ค 2๊ฐ ๋ ์๊ธฐ ๋๋ฌธ์ ์๋ฆฌ๋ฅผ ๊ตํํ๋ค. ๋ค์ L๊ณผ R์ ์ด๋์ํค๋๋ฐ R์ด L๊ณผ ๋ง๋ ๋ฉ์ท๊ธฐ ๋๋ฌธ์ 8๊ณผ ํผ๋ด์ธ 5์ ๊ฐ์ ๋น๊ตํ ํ, 5๊ฐ 8๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ ์๋ฆฌ๋ฅผ ๊ตํํ์ง ์๊ณ 5์ ์์น๋ฅผ ํ์ ํ๋ค.
3๋จ๊ณ : ์ผ์ชฝ ๋ถ๋ถ์งํฉ์ ํต ์ ๋ ฌ์ ์คํํ๋ค. L์ด ๊ฐ๋ฆฌํค๋ ํผ๋ด๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด์ ํผ๋ด ๊ฐ์ธ 4์ R์ด ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋น๊ตํ์์ ๋ 4๋ณด๋ค 3์ด ๋ ์์ผ๋ฏ๋ก ๋ ์์น๋ฅผ ๊ตํํ ๋ค 4์ ์์น๋ฅผ ํ์ ํ๋ค.
4๋จ๊ณ : ์ค๋ฅธ์ชฝ ๋ถ๋ถ์งํฉ์ ํต ์ ๋ ฌ์ ์คํํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก L๊ณผ R ๊ฐ์ ๋น๊ตํ์ฌ ๊ตํํ ๋ค, R์ด L๊ณผ ๋ง๋ ๋ ์ด์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก 7๊ณผ 8์ ๋น๊ตํ์ฌ 7์ ์์น๋ฅผ ํ์ ํ๋ค.
5๋จ๊ณ : ๋ชจ๋ ๋จ์ ๋ถ๋ถ์งํฉ์ ํฌ๊ธฐ๊ฐ 1์ด๋ฏ๋ก ์์น๋ฅผ ํ์ ํ ๋ค ํต ์ ๋ ฌ์ ์ข ๋ฃํ๋ค.
2.2 ์ฝ๋
ํต ์ ๋ ฌ ์ญ์ ์ ๋ ฌ์ ์ํ partition() ํจ์์ ๋ถํ ๊ณผ ํต ์ ๋ ฌ์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ quickSort() ๋ ํจ์๋ฅผ ํตํด ์๋๋๋ค. ํต ์ํธ์ ์๊ฐ ๋ณต์ก๋๋ ํ๊ท ์ ์ผ๋ก O(n log n) ์ผ๋ก ๋น ๋ฅธ ํธ์ด์ง๋ง, ํผ๋ด ์ ์ ์์น์ ๋ฐ๋ผ ์ต์ ์ ๊ฒฝ์ฐ O(n^2)๊ฐ ๋ ์ ์๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ๋นํด ์๋ฆฌ ๊ตํ ํ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ ๋ ฌ ๋ฐฉ๋ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ ์คํ๋๋ค.
์์ ์ฝ๋์ ํผ๋ด์ ์ฒซ ๋ฒ์งธ ์์๋ก ์ค์ ํ์๋ค.
#1. partition(vector<int>::iterator begin, vector<int>::iterator end)
vector<int>::iterator partition(vector<int>::iterator begin, vector<int>::iterator end) {
int pivot = *begin;
auto left = begin + 1;
auto right = end;
while(true) {
while(*left <= pivot && distance(left, right) > 0) left++;
while(*right > pivot && distance(left, right) > 0) right--;
if(left == right) break;
else iter_swap(left, right);
}
if(pivot > *right)
iter_swap(begin, right);
return right;
}
#2. quickSort(vector<int>::iterator begin, vector<int>::iterator end)
void quickSort(vector<int>::iterator begin, vector<int>::iterator end) {
if(distance(begin, end) >= 1) {
auto it = partition(begin, end); // vector<int> it = partition(begin, end);
quickSort(begin, it - 1);
quickSort(it, end);
}
}
+)
์๋ ์๊ณ ๋ฆฌ์ฆ ์์ ๋ค์ ๋ ์ํ๊ธฐ๊ฐ์ ํต ์ํธ๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ฐ์ฐํ ์ฐพ์๋ณด๊ฒ ๋ ์์ ์ค ํ๋์ธ๋ฐ, ๋๊น์ง ๋ณด๊ณ ์์์๋ ๋ด ์์ ์ ๋ณผ ์ ์๋ค. ์์ธ๋ก ๊ทธ ์ด๋ค ์์ ๋ณด๋ค๋ ์ดํด๊ฐ ์๋๋ค.
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด๋ถ ํ์(Binary Search) (0) | 2021.08.08 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ์ํ ๋ฌธ์ - 2. ๋๋น ์ฐ์ ํ์(BFS) (0) | 2021.07.22 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ์ํ ๋ฌธ์ - 1. ๊น์ด ์ฐ์ ํ์(DFS) (0) | 2021.07.21 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ - 1. ๋ณํฉ ์ ๋ ฌ(Merge Sort) (0) | 2021.07.14 |
[์๊ณ ๋ฆฌ์ฆ] ๋์ ๊ณํ๋ฒ(Dynamic Programming) (0) | 2021.07.09 |