ํต ์ ๋ ฌ์ด๋
- ํ๊ท ์ ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ์ ๋ ฌ ๋ฐฉ๋ฒ
- ๋ถํ ์ ๋ณต๋ฒ ์ฌ์ฉ
- ๋ฆฌ์คํธ๋ฅผ 2๊ฐ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ํฉ๋ณ์ ๋ ฌ๊ณผ๋ ๋ค๋ฅด๊ฒ ํต์ ๋ ฌ์ ๋ฆฌ์คํธ๋ฅผ ๋น๊ท ๋ฑ ๋ถํ ํ๊ณ , ๊ฐ๊ฐ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํต์ ๋ ฌํ๋ค
(์ฌ๊ท) - ๋ถ์์ ์ ๋ ฌ์ ์ํ๋ฉฐ ๋ค๋ฅธ ์์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต์ ๋ ฌ์ ์ํ๋ค.
๋ถํ ์ ๋ณต์ด๋? ๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ๋ค์, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ๋ต
๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ๋๊ฐ ์ฌ๊ทํธ์ถ์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
๋ถํ (Divide): ์
๋ ฅ ๋ฐฐ์ด์ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋น๊ท ๋ฑํ๊ฒ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด(ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์์ ์์๋ค์ ์ผ์ชฝ์, ํฐ ์์๋ค์ ์ค๋ฅธ์ชฝ์ ์ค๊ฒ๋)๋ก ๋ถํ ํ๋ค.
์ ๋ณต(Conquer): ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ๋ถ๋ถ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์์ง ์์ผ๋ฉด ์ฌ๊ท ํธ์ถ์ ์ด์ฉํ์ฌ ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ ์ ์ฉํ๋ค.
๊ฒฐํฉ(Combine): ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด์ ํฉ๋ณํ๋ค.
์ฆ, ์ฌ๊ท ํธ์ถ์ด ํ๋ฒ ์งํ๋ ๋๋ง๋ค ์ต์ํ ํ๋์ ์์(ํผ๋ฒ)๋ ์ต์ข ์ ์ผ๋ก ์์น๊ฐ ์ ํด์ง๋ฏ๋ก, ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋์ ๋๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.
ํต์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ณผ์
- ๋ฆฌ์คํธ ์์ ์๋ ํ ์์๋ฅผ ์ ํํ๋ค. ๊ณ ๋ฅธ ์์๋ฅผ
ํผ๋ฒ(pivot)์ด๋ผ๊ณ ํ๋ค. - ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ํผ๋ฒ๋ณด๋ค ์์ ์์๋ค์ ๋ชจ๋ ํผ๋ฒ์ ์ผ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ง๊ณ ํผ๋ฒ๋ณด๋ค ํฐ ์์๋ค์ ๋ชจ๋ ํผ๋ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ง๋ค.
- ํผ๋ฒ์ ์ ์ธํ ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ์ ๋ ฌํ๋ค. (์ฌ๊ทํธ์ถ์ ์ด์ฉํ์ฌ ์ ๋ ฌ ๋ฐ๋ณต)
- ๋ถ๋ถ ๋ฆฌ์คํธ๋ค์ด ๋ ์ด์ ๋ถํ ์ด ๋ถ๊ฐ๋ฅํ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค. (๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ๋ ๋๊น์ง ๋ฐ๋ณต)
- ํผ๋ฒ๊ฐ์ ์ ๋ ฅ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ผ๊ณ ํ๊ฒ ๋ค.
- 2๊ฐ์ ์ธ๋ฑ์ค๋ณ์(low,high)๋ฅผ ์ด์ฉํ์ฌ ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ค.
- (ํผ๋ฒ์ด 5์ธ๊ฒฝ์ฐ)
a. low๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ํด๊ฐ๋ค๊ฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ(8)์ ์ฐพ์ผ๋ฉด ๋ฉ์ถ๋ค.
b. high๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ํ์ํด๊ฐ๋ค๊ฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ(2)๋ฅผ ์ฐพ์ผ๋ฉด ๋ฉ์ถ๋ค.
c. low์ high๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๊ตํํ๋ค.
d. low์ high๊ฐ ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณตํ๋ค. - 2ํ์ : ํผ๋ฒ(1ํ์ ์ ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ)์ด 1์ธ ๊ฒฝ์ฐ, ์์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๋ณต
- 3ํ์ : ํผ๋ฒ(1ํ์ ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ)์ด 9์ธ ๊ฒฝ์ฐ, ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๋ณต
ํต์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ C์ธ์ด ์ฝ๋
# include <stdio.h>
# define MAX_SIZE 9
# define SWAP(x, y, temp) ( (temp)=(x), (x)=(y), (y)=(temp) )
// 1. ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก 2๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ค.
// 2. ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ๋ชจ๋ ์ผ์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ์ฎ๊ธด๋ค.
/* 2๊ฐ์ ๋น๊ท ๋ฑ ๋ฐฐ์ด list[left...pivot-1]์ list[pivot+1...right]์ ํฉ๋ณ ๊ณผ์ */
/* (์ค์ ๋ก ์ซ์๋ค์ด ์ ๋ ฌ๋๋ ๊ณผ์ ) */
int partition(int list[], int left, int right){
int pivot, temp;
int low, high;
low = left;
high = right + 1;
pivot = list[left]; // ์ ๋ ฌํ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์ผ์ชฝ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ์ผ๋ก ์ ํ(์์์ ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ํ)
/* low์ high๊ฐ ๊ต์ฐจํ ๋๊น์ง ๋ฐ๋ณต(low<high) */
do{
/* list[low]๊ฐ ํผ๋ฒ๋ณด๋ค ์์ผ๋ฉด ๊ณ์ low๋ฅผ ์ฆ๊ฐ */
do {
low++; // low๋ left+1 ์์ ์์
} while (low<=right && list[low]<pivot);
/* list[high]๊ฐ ํผ๋ฒ๋ณด๋ค ํฌ๋ฉด ๊ณ์ high๋ฅผ ๊ฐ์ */
do {
high--; //high๋ right ์์ ์์
} while (high>=left && list[high]>pivot);
// ๋ง์ฝ low์ high๊ฐ ๊ต์ฐจํ์ง ์์์ผ๋ฉด list[low]๋ฅผ list[high] ๊ตํ
if(low<high){
SWAP(list[low], list[high], temp);
}
} while (low<high);
// low์ high๊ฐ ๊ต์ฐจํ์ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์ list[left]์ list[high]๋ฅผ ๊ตํ
SWAP(list[left], list[high], temp);
// ํผ๋ฒ์ ์์น์ธ high๋ฅผ ๋ฐํ
return high;
}
// ํต ์ ๋ ฌ
void quick_sort(int list[], int left, int right){
/* ์ ๋ ฌํ ๋ฒ์๊ฐ 2๊ฐ ์ด์์ ๋ฐ์ดํฐ์ด๋ฉด(๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ์๋๋ฉด) */
if(left<right){
// partition ํจ์๋ฅผ ํธ์ถํ์ฌ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ๋น๊ท ๋ฑ ๋ถํ -๋ถํ (Divide)
int q = partition(list, left, right); // q: ํผ๋ฒ์ ์์น
// ํผ๋ฒ์ ์ ์ธํ 2๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋์์ผ๋ก ์ํ ํธ์ถ
quick_sort(list, left, q-1); // (left ~ ํผ๋ฒ ๋ฐ๋ก ์) ์์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ ๋ ฌ -์ ๋ณต(Conquer)
quick_sort(list, q+1, right); // (ํผ๋ฒ ๋ฐ๋ก ๋ค ~ right) ๋ค์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ ๋ ฌ -์ ๋ณต(Conquer)
}
}
int main(void){
int i;
int n = MAX_SIZE;
int list[9] = {5, 3, 8, 4, 9, 1, 6, 2, 7};
// ํต ์ ๋ ฌ ์ํ(left: ๋ฐฐ์ด์ ์์ = 0, right: ๋ฐฐ์ด์ ๋ = 8)
quick_sort(list, 0, n-1);
// ์ ๋ ฌ ๊ฒฐ๊ณผ ์ถ๋ ฅ
for(i=0; i<n; i++){
printf("%d\n", list[i]);
}
}
ํต์ ๋ ฌ ํน์ง ๋ฐ ์๊ฐ๋ณต์ก๋
์ฅ์
- ์๋๊ฐ ๋น ๋ฅด๋ค (O(nlogโn)๋ฅผ ๊ฐ์ง๋ ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๊ตํ์ ๋๋ ๊ฐ์ฅ ๋น ๋ฅด๋ค.)
- ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์๋๋ค.(O(log n)๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ค.)
๋จ์
- ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์๋ ํต์ ๋ ฌ์ด ๋ถ๊ท ํ ๋ถํ ์ ์ํด ์คํ๋ ค ์ํ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
- ํต ์ ๋ ฌ์ ๋ถ๊ท ํ์ ๋ฐฉ์งํ๊ธฐ ์ํ์ฌ ํผ๋ฒ์ ์ ํํ ๋ ์ ์ ํ ํผ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.(๋ณดํต ์ค๊ฐ๊ฐ)
์๊ฐ๋ณต์ก๋
์ต์ ์ ๊ฒฝ์ฐ (๊ฑฐ์ ๊ท ๋ฑํ ๋ฆฌ์คํธ๋ก ๋ถํ ๋๋ ๊ฒฝ์ฐ)
- ํจ์ค ์: log(n)
- ๊ฐ ํจ์ค ์์์์ ๋น๊ตํ์: n
- ์ด ๋น๊ตํ์: nlog(n)
- ์ด ์ด๋ํ์: ๋น๊ตํ์์ ๋นํ์ฌ ์ ์ผ๋ฏ๋ก ๋ฌด์ ๊ฐ๋ฅ
์ต์ ์ ๊ฒฝ์ฐ (๋ฆฌ์คํธ๊ฐ ๋ถ๊ท ํํ๊ฒ ๋๋์ด์ง๋ ๊ฒฝ์ฐ) (ํนํ ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒฝ์ฐ)
- ํจ์ค ์: n
- ๊ฐ ํจ์ค์์์์ ๋น๊ต ํ์: n
- ์ด ๋น๊ตํ์: n^2
- ์ด ์ด๋ํ์: ๋ฌด์ ๊ฐ๋ฅ
์ค๊ฐ๊ฐ(medium)์ ํผ๋ฒ์ผ๋ก ์ ํํ๋ฉด ๋ถ๊ท ๋ฑ ๋ถํ ์ํ ๊ฐ๋ฅ