ํต ์ ๋ ฌ์ด๋ ๋ฌด์์ผ๊น?
ํต ์ ๋ ฌ์ ์ฌ์ฉ๋๋ ์ฉ์ด๋ถํฐ ์ดํด๋ด ์๋ค.
| ์ฉ์ด | ์ค๋ช |
|---|---|
| Pivot | ์ ๋ ฌ์ ์ค์ฌ์ ๋งํฉ๋๋ค. ์ฝ์ ๋๋ ํผ๋ฒ(Pivot)์ด๋ผ๊ณ ์ฝ์ต๋๋ค. |
| Low | Pivot์ ์ ์ธํ ๊ฐ์ฅ ์ผ์ชฝ์ ์์นํ ์ง์ ์ ๊ฐ๋ฆฌํต๋๋ค. |
| High | Pivot์ ์ ์ธํ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์์นํ ์ง์ ์ ๊ฐ๋ฆฌํต๋๋ค. |
| Left | ์ ๋ ฌํ ์์๋ค์ ๊ฐ์ฅ ์ผ์ชฝ ์ง์ ์ ๊ฐ๋ฆฌํต๋๋ค |
| Right | ์ ๋ ฌํ ์์๋ค์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ง์ ์ ๊ฐ๋ฆฌํต๋๋ค. |
์๋ ์์ ๊ทธ๋ฆผ์ ํตํด์ ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ด ์๋ค. ์ฌ๊ธฐ์ pivot์ ๊ฐ์ฅ ์ผ์ชฝ์ ์์นํ < ์์ 6 > ์ ๋๋ค.

low๋ < ์์ 3 > ์ด๋ฉฐ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋ฉด์ ์ ๋ ฌ์ ์งํํฉ๋๋ค. ๋ฐ๋๋ก high๋ < ์์ 7 > ์ด๋ฉฐ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋ฉด์ ์ ๋ ฌ์ ์งํํฉ๋๋ค. ๋ฌผ๋ก low์ high๋ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ํ ์นธ์ฉ ์์ง์ด๋ ๊ฒ์ด ์๋๋ผ ๋ณ๊ฐ๋ก ์งํ๋ฉ๋๋ค.
ํต ์ ๋ ฌ ์งํ
์งํ ๊ท์น์ ๊ฐ๋จํฉ๋๋ค. high๋ pivot ๋ณด๋ค ์์ ๊ฐ์ ์ฐพ๊ณ ๋ฐ๋๋ก low๋ pivot ๋ณด๋ค ํฐ ๊ฐ์ ์ฐพ์ต๋๋ค. ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ ์ฐพ๋ ๊ฒฝ์ฐ high์ low๊ฐ ์ฐพ์ ๊ฐ์ ์๋ก ๊ตํํ๋ ๊ฒ์ด์ง์.

< ๊ตํ 1ํ ์งํ > ํ์ ๋ชจ์ต์ ๋๋ค. high๊ฐ ์ฐพ์ < ์์ 2 >์ low๊ฐ ์ฐพ์ < ์์ 9 >๊ฐ ๊ตํ๋์์ต๋๋ค. high์ low๊ฐ ์๋ก ๊ตํ๋ ํ์๋ high๋ ์ผ์ชฝ ๋ฐฉํฅ์ผ๋ก pivot ๋ณด๋ค ๋ ํฐ ๊ฐ์ ์ฐพ์ ์ด๋ํ๊ณ low๋ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก pivot ๋ณด๋ค ๋ ์์ ๊ฐ์ ์ฐพ์ ์์ง์ ๋๋ค.

high๋ pivot์ธ < ์์ 6 >๋ณด๋ค ์์ < ์์ 1 >์ ๋ฐ๊ฒฌํ๊ณ , low๋ pivot๋ณด๋ค ํฐ < ์์ 9 >๋ฅผ ์ฐพ์์ต๋๋ค. ํ์ง๋ง, ์ง๊ธ์ฒ๋ผ high์ low๊ฐ ์๋ก ๊ต์ฐจ๋๋ ๊ฒฝ์ฐ์๋ ์๋ก ๊ฐ์ ๊ตํํ์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ high์ low์ ์ด๋๊ณผ ๊ตํ์ด ์๋ฃ๊ฐ ๋์์์ ๋ปํ๊ธฐ ๋๋ฌธ์ด์ง์.

์ด๋ํ pivot ๊ฐ์ ์์น๋ฅผ ๋ณด๋ฉด ์์์ ๋ค ๋ฒ์งธ์ ์์นํด์์ต๋๋ค. ์ ๋ ฌ ๋์์ด 6๊ฐ์ ์์๋ฐ์ ๋์ง ์์ ๋์น์ฑ์ ๋ถ๋ค๋ ๊ณ์๊ฒ ์ง๋ง ๋ฐฉ๊ธ ๊ตํ์ผ๋ก ์ธํ์ฌ < ์์ 6 >์ ์์ ์ ์ ๋ ฌ ์์น๋ฅผ ์ฐพ๊ฒ ๋์์ต๋๋ค.
์ดํ์๋ ์์ ์ ์ ๋ ฌ ์์น๋ฅผ ์ฐพ์ < ์์ 6 >์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์์ญ์ผ๋ก ๋๋์ด ์ ๊ณผ์ ์ ๋ค์ ์งํํ๊ฒ ๋ฉ๋๋ค.

ํต ์ ๋ ฌ ๊ตฌํ
์์ ํต ์ ๋ ฌ ๊ณผ์ ์ ์์ค ์ฝ๋๋ก ์ดํด๋ด ์๋ค.
#include <stdio.h>
#include <stdlib.h>
void Swap(int arr[], int firstIndex, int secondIndex)
{
int temp = arr[firstIndex];
arr[firstIndex] = arr[secondIndex];
arr[secondIndex] = temp;
}
int Partition(int arr[], int left, int right)
{
// pivot์ ์์น๋ ๊ฐ์ฅ ์ผ์ชฝ ์์๋ก ์ ํ๋ค.
int pivot = arr[left];
int low = left + 1;
int high = right;
// low์ high๊ฐ ๊ต์ฐจ๋์ง ์์ ๋๊น์ง
while (low <= high)
{
// low๋ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ์ฐพ๋๋ค.
while (pivot >= arr[low] && low <= right)
low++;
// high๋ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ์ฐพ๋๋ค.
while (pivot <= arr[high] && high >= (left+1))
high--;
// low์ high๊ฐ ๊ต์ฐจํ์ง ์์๋ค๋ฉด ๋ ๊ฐ์ ๊ตํํ๋ค.
if (low <= high) Swap(arr, low, high);
}
// ํผ๋ฒ๊ณผ high๋ฅผ ๊ตํํ๋ค.
Swap(arr, left, high);
return high;
}
void QuickSort(int arr[], int left, int right)
{
if (left <= right)
{
// ๋ถํ ํ๋ค.
int pivot = Partition(arr, left, right);
// ์ผ์ชฝ์ ์์นํ ์์๋ค์ ์ ๋ ฌํ๋ค.
QuickSort(arr, left, pivot - 1);
// ์ค๋ฅธ์ชฝ์ ์์นํ ์์๋ค์ ์ ๋ ฌํ๋ค.
QuickSort(arr, pivot + 1, right);
}
}
int main(void)
{
int arr[] = { 6, 3, 9, 1, 2, 7 };
int index = 0;
int arrSize = (sizeof(arr) / sizeof(int));
QuickSort(arr, 0, arrSize - 1);
for (index = 0; index < arrSize; index++)
printf("%d ", arr[index]);
return 0;
}
low์ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ high์ ๊ฐ์ ๊ฐ์์ํค๋ ๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด ํ๋์ฉ ์ดํด๋ด ์๋ค. ๋จผ์ low์ ์ฆ๊ฐ ์กฐ๊ฑด์ ๋๋ค.
/* pivot ๋ณด๋ค ๋ ํฐ ๊ฐ์ ์ฐพ์์ผ ํ๋ ์กฐ๊ฑด */
1) pivot >= arr[low]
/* low์ ๊ฐ์ด right์ ๊ฐ๋ณด๋ค ๋ ์ปค์ง๊ฒ ๋๋ ๊ฒฝ์ฐ๋ ๋ฐฐ์ด์ ์ต๋ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ๋์ด๊ฐ ๊ฒ์ผ๋ก ํ๋จ */
2) low <= right
๋ค์์ผ๋ก high์ ๊ฐ์ ์กฐ๊ฑด์
๋๋ค.
/* high๋ pivot ๋ณด๋ค ๋ ์์ ๊ฐ์ ์ฐพ์์ผ ํ๋ ์กฐ๊ฑด */
1) pivot >= arr[low]
/* high์ ๊ฐ์ด (left + 1)๋ณด๋ค ์์์ง๋ ๊ฒฝ์ฐ๋ pivot์ ๊ฐ๋ฆฌํค๊ฑฐ๋ ๋ฐฐ์ด์ ์ต์ ์ธ๋ฑ์ค ๋์ด ๊ฐ๋ ๊ฒ์ผ๋ก ํ๋จ */
2) high >= (left + 1)
pivot์ ์์น์ ๋ํด์
์ด๋ฒ ํฌ์คํ ์์ ์งํํ ๊ฒ์ฒ๋ผ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ์์๋ฅผ pivot์ผ๋ก ์ง์ ํ๋ ๊ฒฝ์ฐ ๋ถ๊ท ๋ฑํ๊ฒ ๋๋ ์ ์๋ ์ด์๊ฐ ์์ต๋๋ค. ์์ ์ ๋ค๋ฅด๊ฒ pivot์ด ์ค๊ฐ์ ์์นํ๋ฉด ์ ๋ ฌ ์์๋ค์ด ๊ท ๋ฑํ๊ฒ ๋๋์ด์ง๋๋ค. ์ด๋ฌํ ์ด์ ๋ก pivot์ ์์น๋ฅผ ์ค๊ฐ์ ์๋ ์์๋ก ์ง์ ํ๋ฉด ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
์ฆ, ์ ์ฒด์ ์์๋ฅผ ํ์ํด์ ์ค๊ฐ๊ฐ์ ์ฐพ๋ ์์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ pivot์ ์ข์ธก ๋, ์ค์, ์ฐ์ธก ๋ ์ค ์ค๊ฐ๊ฐ์ ์ด์ฉํด์ ์ ํฉ๋๋ค.
ํต ์ ๋ ฌ์ ์ฑ๋ฅ์?
pivot์ด ์์ ์ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋น๊ต ์ฐ์ฐ์ ์์๋ค์ ๊ฐ์์ธ n๋ฒ ๋งํผ ๋ฐ์ํฉ๋๋ค. ๋ฌผ๋ก pivot์ธ ์๊ธฐ ์์ ์ผ๋ก ์ธํด n๋ณด๋ค ํ๋ ์ ์ ํ์์ ๋น๊ต ์ฐ์ฐ์ด ์งํ๋์ง๋ง, ์ด๋ ๋ฌด์๋ฉ๋๋ค.
๋ถํ ์ด ๋ช ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ ์ง๋ ์ดํด๋ด์ผ ํฉ๋๋ค. ์์์ ๊ฐ์๊ฐ 31๊ฐ๋ผ๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๊ฐ์ฅ ์ด์์ ์ผ๋ก pivot์ ์์น๊ฐ ์ค๊ฐ์ผ๋ก ๊ฒฐ์ ๋๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ถํ ๊ณผ์ ์์ ์ ์ฒด ์์๋ค์ 15๊ฐ์ฉ ๋๋ก ๋๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ฒ ๋ถํ ์์ ๊ฐ๊ฐ 7๊ฐ์ฉ ๋๋์ด ์ด 4๊ฐ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ด ์์ญ๋ค์ ๋ ๋ค์ 3๊ฐ์ฉ์ ์์๋ค๋ก ๋๋์ด 3๊ฐ์ฉ์ ์์๋ค๋ก ๋๋์ด ์ด 8๊ฐ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ ์ต์ข ์ ์ผ๋ก๋ 1๊ฐ์ฉ ๋๋์ด ์ด 16๊ฐ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
๋ถํ ํ๋ ํ์๋ฅผ k๋ผ๊ณ ๊ฐ์ ํ ๋ ์์๋ค์ ๊ฐ์ n๊ณผ k๋ \(k=\log _{ 2 }{ n }\)์ผ๋ก ํํํ ์ ์์ต๋๋ค. ์ฆ, ํต ์ ๋ ฌ์ ๋น๊ต ํ์๋ \(n\log _{ 2 }{ n }\) ์ด๋ฉฐ ๋น -์ค ํ๊ธฐ๋ฒ์ผ๋ก ํํํ๋ฉด \(o(n\log _{ 2 }{ n } )\) ์ ๋๋ค.
ํ์ง๋ง ์์๋ค์ด ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ์์ pivot์ด ๊ฐ์ฅ ์์ ๊ฐ(์์ ์ฒ๋ผ pivot์ ์ง์ )์ด๋ผ๋ฉด \(k=n\) ์ด ๋ฉ๋๋ค. ์ฆ, ์ต์ ์ ๊ฒฝ์ฐ๋ \(o({ n }^{ 2 })\) ๊ฐ ์ฑ๋ฆฝ๋ฉ๋๋ค.