๐ ํต์ํธ (QuickSort) : ์๋ฆฌ, ๋ฐฉ์ ๋น๊ต, ์๋ฐ ๊ตฌํ๊น์ง
โจ ํต์ํธ๋?
ํต์ํธ(QuickSort)๋ ๋ถํ ์ ๋ณต(Divide and Conquer) ์ ๋ต์ ํ์ฉํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
ํผ๋ฒ(Pivot)์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ถํ ํ๊ณ , ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌ์ ์ํํ์ฌ ์ ์ฒด ์ ๋ ฌ์ ์์ฑํฉ๋๋ค.
โ๏ธ ์๋ ์๋ฆฌ: ๋ถํ ์ ๋ณต
ํต์ํธ๋ ๋ค์ ์ธ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
| ๋จ๊ณ | ์ค๋ช |
| ๋ถํ | ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ๊ณผ ํฐ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ๋๋๋ค |
| ์ ๋ณต | ์ข์ฐ ํ์ ๋ฐฐ์ด์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ํต์ํธ๋ฅผ ์ ์ฉํ๋ค |
| ๊ฒฐํฉ | ๋ณ๋ ๋ณํฉ ์์ด ์ ์๋ฆฌ ์ ๋ ฌ (in-place) ๋ฐฉ์์ผ๋ก ์๋ฃ๋จ |
๐ ๋ถํ (Partition)์ ์๋ฏธ
๋ฐฐ์ด์ ๊ฐ์ ํผ๋ฒ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ถ๋ฆฌ
์๊ธฐ ์์ ๊ณผ๋ ๋น๊ตํ๊ณ ํ์ํ๋ฉด ์ค์
์ด ๊ณผ์ ์์ ํผ๋ฒ์ ์์น๋ ์ ๋ ฌ๋ ์ํ๋ก ํ์ ๋จ
์ดํ ์ข/์ฐ ํ์ ๋ฐฐ์ด์ ๊ณ์ ํต์ํธ๋ก ์ ๋ ฌ
๐ง ํผ๋ฒ๊ณผ ํํฐ์ ๋์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋๊ฐ?
ํํฐ์ ๋์ด๋ ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด ์์๋ฅผ ๋น๊ตํ๋ฉฐ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ํผ๋ฒ๊ณผ ๋น๊ตํฉ๋๋ค.
์๊ธฐ ์์ ๋ ๋น๊ต ๋์์ด๋ฉฐ, ์กฐ๊ฑด ์ถฉ์กฑ ์ ์๊ธฐ ์์ ๊ณผ๋ ์ค์์ด ๋ฐ์ํฉ๋๋ค.
๋น๊ต ๋ฐฉ์ ๋ฐ ์ค์ ๋ฐฉ์์ ๋ถํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๐งญ ๋ถํ ๋ฐฉ์ ์ข ๋ฅ: Hoare vs. Lomuto
| ํญ๋ชฉ | Hoare ๋ถํ | Lomuto ๋ถํ |
| ์ด๋ฆ ์ ๋ | Tony Hoare (ํต์ํธ ์ฐฝ์์) | Nico Lomuto (๊ตฌํ ๋ฐฉ์ ์ ๊ณต์) |
| ํผ๋ฒ ์์น | ๋ณดํต ์ค๊ฐ๊ฐ | ๋ณดํต ๋ง์ง๋ง ๊ฐ |
| ๋น๊ต ๋ฐฉ์ | ์ ๋์์ ์ค์์ผ๋ก ์ด๋ | ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์ฐจ ๋น๊ต |
| ์ค์ ํ์ | ์ ์ | ๋ง์ (์๊ธฐ ์์ ๊ณผ๋ ์์ฃผ ์ค์) |
| ์คํ ์๋ | ๋น ๋ฆ | ์๋์ ์ผ๋ก ๋๋ฆผ |
| ์ฝ๋ ๋ณต์ก๋ | ๋ณต์ก | ๋จ์ |
| ์ฌ์ฉ ์ฉ๋ | ์ค๋ฌด, ๋๊ท๋ชจ ๋ฐ์ดํฐ | ํ์ต์ฉ, ๋จ์ ๊ตฌํ |
๐งช ์คํ ์์ ๋น๊ต (๊ณตํต ๋ฐฐ์ด:
[34, 7, 23, 32, 5, 62]
)
โ Hoare ๋ฐฉ์ (ํผ๋ฒ: 23)
swap(0,4) โ [5, 7, 23, 32, 34, 62]
left=3, right=2 โ ์ข ๋ฃ
โ ๊ฒฐ๊ณผ: [5, 7, 23, 32, 34, 62]
โ Lomuto ๋ฐฉ์ (ํผ๋ฒ: 62)
์๊ธฐ ์์ ๊ณผ 6๋ฒ ์ค์ ๋ฐ์
๊ฐ ์ฌ๋ฐฐ์น ์์ด ๊ทธ๋๋ก [34, 7, 23, 32, 5, 62]
โ ๋ถํ ๋ง ์๋ฃ๋ ์ํ (์ ๋ ฌ์ ์ดํ ์งํ๋จ)
๐ป ์๋ฐ ๊ตฌํ ์์
1. Hoare ๋ถํ ๋ฐฉ์
int pivot = arr[(left + right) / 2];
while (left <= right) {
while (arr[left] < pivot) left++;
while (arr[right] > pivot) right--;
if (left <= right) {
swap(arr, left, right);
left++; right--;
}
}
2. Lomuto ๋ถํ ๋ฐฉ์
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++; swap(arr, i, j);
}
}
swap(arr, i + 1, high);
โ ์ ๋ฆฌ ์์ฝ
| ๊ตฌ๋ถ | Hoare ๋ถํ | Lomuto ๋ถํ |
| ์๋ | ํ๊ท ์ ์ผ๋ก ๋ ๋น ๋ฆ | ๋จ์ํ์ง๋ง ๋นํจ์จ ๊ฐ๋ฅ |
| ๋น๊ต ๊ตฌ์กฐ | ์์ชฝ์์ ๊ฐ์ด๋ฐ๋ก | ํ ๋ฐฉํฅ ์์ฐจ ๋น๊ต |
| ์ค์ | ์ ๊ณ ํจ์จ์ | ์์ฃผ ๋ฐ์ |
| ์ฝ๋ ๋์ด๋ | ๋ค์ ๋ณต์ก | ๊ฐ๋จํ๊ณ ์ง๊ด์ |
| ์ ํฉ ์ฉ๋ | ์ค๋ฌด, ๋๊ท๋ชจ ์ ๋ ฌ | ํ์ต์ฉ, ๊ฐ๋จํ ์ ๋ ฌ |