์๋ ํ์ธ์, ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ฆฌํ๋ ํฌ์คํ ์ ๋๋ค. ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฐธ๊ณ ํ์๋ ค๋ฉด ํด๋น ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ด์ฉํด์ฃผ์ธ์. ๐
Quick Sort
Quick Sort๋ real-world ๋ฐ์ดํฐ์์ ๋น ๋ฅด๋ค๊ณ ์๋ ค์ ธ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
pivot์ด๋ผ๋ ๊ฒ์ ์ง์ ํ์ฌ pivot ์ผ์ชฝ์ผ๋ก๋ pivot๋ณด๋ค ์์ ๊ฐ๋ค์, ์ค๋ฅธ์ชฝ์๋ pivot๋ณด๋ค ํฐ ๊ฐ๋ค์ ์ฌ๋ฐฐ์นํ๋ฉฐ, ๊ณ์ํ์ฌ ๋ถํ ํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
Quick Sort๋ ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ํตํด ์ ๋ ฌํฉ๋๋ค.
Merge Sort์ ๋ฌ๋ฆฌ Quick Sort๋ ๋น๊ท ๋ฑํ๊ฒ ๋ถํ ํฉ๋๋ค.
๋ถ์์ ์ ๋ ฌ์ ์ํฉ๋๋ค.
์๊ฐ ๋ณต์ก๋ : O(N^2)
๊ณต๊ฐ ๋ณต์ก๋ : O(N)
๊ณผ์
1. ๋จผ์ ๋ฐฐ์ด์ ์์๋ค ์ค ์์๋ก pivot์ ์ง์ ํ๋ค. (๋ณดํต ๊ฐ์ฅ ์ ์์๋ฅผ ์ ํํ๋ค.)
- ๋จผ์ ๋ง์ง๋ง ์์น๋ถํฐ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์์ํค๋ฉด์ ํผ๋ด๋ณด๋ค ์์ ์๋ฅผ ์ฐพ๋๋ค. (์ ๋จผ์ ์์ ์ ๋ถํฐ ์ฐพ๋์ง ์๋์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.)
- ์์ ์์น + 1 ๋ถํฐ ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ํผ๋ด๋ณด๋ค ํฐ ์๋ฅผ ์ฐพ๋๋ค.
- ์ธ์ ๊น์ง ๋ฐ๋ณตํ๋๊ฐ? ๋ฐ๊ฒฌํ ํฐ ์์ ์ธ๋ฑ์ค์ ๋ฐ๊ฒฌํ ์์ ์์ ์ธ๋ฑ์ค๊ฐ ์๋ก ์๊ฐ๋ ธ์ ๋๊น์ง!
- "์๊ฐ๋ ธ๋ค." ์ด๊ฒ ๋ฌด์จ ๋ง์ธ๊ฐ์?
- ์๋์ ๊ฐ์ด i, j๊ฐ ์๊ฐ๋ฆฐ ๊ฒฝ์ฐ๋ ๊ฐ์ฅ ์์ ์์ ํผ๋ด์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค. ํผ๋ด์ ๋ ์ด์ ์ ๋ ฌํ ํ์๊ฐ ์์ต๋๋ค.
10 9 8 7 13
(p) |(i)
(j)|
์ผ๋จ ์ด ๊ณผ์ ๋ค์ ๋ฌด์์ ๋ฐ๋ผํ๋ฉด์ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
1-1. ์์ ์๋ฅผ ์ฐพ๋ ๊ณผ์
๋ง์ง๋ง ์์๋ถํฐ ํผ๋ด๊น์ง ์ดํผ๋ฉด์ ํผ๋ด๋ณด๋ค ๊ฐ๊ฑฐ๋ ์์ ์๋ฅผ ์ฐพ์ต๋๋ค.
(์ด๋ ํผ๋ด๊ณผ ๊ฐ์ ์๋ฅผ ์ฐพ๋ ์ด์ ๋ ๋ฐ๋ก, ์กฐ๊ฑด๋ฌธ ํ๋๋ฅผ ์ค์ด๊ธฐ ์ํจ์ ๋๋ค.)
์ฝ๋๋ก ํํํ๋ฉด ์ด๋ ์ต๋๋ค.
while( pivot < arr[j]) j--;
// ๋ง์ฝ pivot๊ณผ ๊ฐ์ ๊ฒ์ ์ฐพ์ง ์๋๋ค๋ฉด ์๋์ฒ๋ผ ๋ฉ๋๋ค.
while( pivot <= arr[j] && j > pivot_idx ) j--;
1-2. ํฐ ์๋ฅผ ์ฐพ๋ ๊ณผ์
ํผ๋ด๋ถํฐ ๋ง์ง๋ง๊น์ง ์ดํผ๋ฉด์ ํผ๋ด๋ณด๋ค ํฐ ์๋ฅผ ์ฐพ์ต๋๋ค. ์ด๋๋ ์ธ๋ฑ์ค๊ฐ ๋์ด๊ฐ์ง ์๋๋ก ์ฃผ์ํด์ค์ผ๊ฒ ์ฃ ?
while( pivot >= arr[i] && i < end) i++;
ํ์ง๋ง ์ ์กฐ๊ฑด์ ํ๋ ธ์ต๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์ ์ธ๋ฑ์ค i์ j๊ฐ ์๋ก ์๊ฐ๋ฆฐ ์ํฉ์ ์ฒดํฌํด์ผ ํ๋๋ฐ ์ ์กฐ๊ฑด์ ๊ทธ๊ฒ์ ์ฐพ์๋ด์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์๋์ ๊ฐ์ด i์ j๊ฐ ์๊ฐ๋ ธ๋์ง ์ฒดํฌํด์ค์ผํฉ๋๋ค.
while( i < j && pivot >= arr[i] ) i++;
ํด๋น ์กฐ๊ฑด์ ์ฃผ๊ธฐ ์ํด, ๋ฏธ๋ฆฌ ์์ ์๋ฅผ ์ฐพ์์ j์ ๊ฐ์ ์ฐพ์ ๊ฒ์ ๋๋ค.
2. ๋์ ์ํ๋ฅผ ์ดํด๋ณด์
์ง๊ธ์ i์ j๊ฐ ์๊ฐ๋ฆฌ๊ธฐ ์ง์ ์ ์ํฉ์ ๋๋ค. ์ด๋ฐ ์ํฉ์์๋ ํผ๋ด๋ณด๋ค ํฐ ์๋ ์๊ธฐ ๋๋ฌธ์ i์ j์ ์์น๋ฅผ ์๋ก ๋ฐ๊ฟ์ฃผ๋ฉด i ์์น์ ๊ฐ์ฅ ์์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋ ๊ฒ์ด๊ณ , ๊ทธ i ์์น์ ํด๋นํ๋ ๊ฐ๊ณผ ํผ๋ด๊ณผ ๋ฐ๊ฟ์ค๋๋ค.
ํด๋น ๊ตํํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋ฉ๋๋ค.
while( i < j ) {
while( pivot < arr[j] ) j--;
while( i < j && pivot >= arr[i] ) i++;
swap(i, j); // ์์น ๊ตํ
}
// i์ j๊ฐ ์๊ฐ๋ ธ์ ๋
swap(pivot, i);
๊ฒฐ๊ณผ
ํผ๋ด์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์๋ ํผ๋ด๋ณด๋ค ์์ ์, ์ค๋ฅธ์ชฝ์ ํฐ ์๊ฐ ์ค๊ฒ ๋ฉ๋๋ค. (ํ์ฌ๋ ํฐ ์๊ฐ ์์.)
์ด์ ํผ๋ด ๊ธฐ์ค์ผ๋ก ์ ๋ฐ์ ๋๋ ์ ๋ค์ ํต ์ ๋ ฌ์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค!
์ฝ๋๋ก ํํํ๋ฉด ์๋์ ๊ฐ์ด ๋ฉ๋๋ค!
quick_sort( start_idx, i - 1 ); // ํผ๋ด๋ณด๋ค ์์ ์๋ค์ ๋ํด์
quick_sort( i + 1, end_idx ); // ํผ๋ด๋ณด๋ค ํฐ ์๋ค์ ๋ํด์
์ ์ฒด ์ฝ๋
void quick_sort(int start_idx, int end_idx) {
int pivot = arr[start_idx];
int i = start_idx;
int j = end_idx;
int temp;
while( i < j ) {
while( pivot < arr[j] ) j--;
while( i < j && pivot >= arr[i] ) i++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
arr[start_idx] = arr[i];
arr[i] = pivot;
quick_sort(start_idx, i - 1);
quick_sort(i + 1, end_idx);
}