๐กํต ์ ๋ ฌ(Quick sort) ์๊ณ ๋ฆฌ์ฆ?
- ์ฐฐ์ค ์คํฐ๋ ๋ฆฌ์ฒ๋ ํธ์ด๊ฐ ๊ฐ๋ฐํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ค๋ฅธ ์์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต ์ ๋ ฌ์ ์ํจ
- ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ํตํด ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌ
- ๋ฆฌ์คํธ ๊ฐ์ด๋ฐ์ ํ๋์ ์์๋ฅผ ๊ณ ๋ฆ, ์ด ์์๋ฅผ ํผ๋ฒ ์ด๋ผ๊ณ ํ๋ค.
- ํผ๋ฒ ์์๋ ํผ๋ฒ๋ณด๋ค ๊ฐ์ด ์์ ๋ชจ๋ ์์๋ค์ด ์ค๊ณ , ํผ๋ฒ ๋ค์๋ ๋นํ๋ณด๋ค ๊ฐ์ด ํฐ ๋ชจ๋ ์์๋ค์ด ์ค๋๋ก ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ๋๋ก ๋๋๋ค. -> ๋ฆฌ์คํธ๋ฅผ ๋๋ก ๋๋๋ ๊ฒ์ ๋ถํ ์ด๋ผ๊ณ ํ๋ค.
- ๋ถํ ์ ๋ง์น ๋ค์ ํผ๋ฒ์ ๋ ์ด์ ์์ง์ด์ง ์๋๋ค.
- ๋ถํ ๋ ๋ ๊ฐ์ ์์ ๋ฆฌ์คํธ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. -> ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ๋ ๋๊น์ง ์ฌ๊ท๋ฅผ ๋ฐ๋ณต
๐ก๊ตฌ์ฒด์ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ํํค์ณ๋ณด์
- ํต ์ ๋ ฌ์ ๋ค์์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ๋ถํ : ์ ๋ ฅ ๋ฐฐ์ด์ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋น๊ท ๋ฑํ๊ฒ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด๋ก ๋๋์ด์ง๋ค. (์ผ์ชฝ : ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ์์ ์๋ค, ์ค๋ฅธ์ชฝ : ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ํฐ ์๋ค)
- ์ ๋ณต : ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ๋ถ๋ถ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์ ์ง ์์ผ๋ฉด ์ํ ํธ์ถ์ ์ด์ฉํ์ฌ ๋ค์ ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์ ์ฉ
- ๊ฒฐํฉ : ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด๋ก ํฉ๋ณํ๋ค.
๐ก ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์์
- ํผ๋ฒ์ ์ ๋ ฅ ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ก ํ๋ค.
- low, high ์ธ๋ฑ์ค ๋ณ์๋ฅผ ์ด์ฉํด์ ๋ฆฌ์คํธ๋ฅผ ๋๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ค.
- 1ํ์ : ํผ๋ฒ = 5
- low : ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์, ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ(8)์ ์ฐพ์ผ๋ฉด ๋ฉ์ถ๋ค.
- high : ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ํ์, ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ(2)์ ์ฐพ์ผ๋ฉด ๋ฉ์ถ๋ค.
- low์ high๊ฐ ๊ฐ๋ฆฌํค๋ ๋๋ฐ์ดํฐ๋ฅผ ์๋ก ๊ตํํ๋ค.
- ์ด ํ์๊ณผ ๊ตํ ๊ณผ์ ์ low์ high๊ฐ ์๊ฐ๋ฆด๋๊น์ง ๋ฐ๋ณตํ๋ค.
- 2,3ํ์ : ์์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๋ณตํ๋ค.
๐ก C++ ์ฝ๋
#include <iostream>
using namespace std;
// ๋ ๊ฐ์ ์๋ก ๋ฐ๊พธ๋ swap ํจ์ ๋ง๋ค๊ธฐ
void swap(int *a, int *b, int temp){
temp = *b;
*b = *a;
*a = temp;
}
// ๋ถ๋ถ์ ๋ ฌ ( -> pivot์ ์์น ๋ฆฌํด )
int partition(int list[], int left, int right){
int pivot, temp;
int low, high;
pivot = list[left];
low = left;
high = right+1;
// ์ ์ฒด do-while ๋ฌธ : low์ high๊ฐ ๊ต์ฐจํ ๋๊น์ง ๋ฐ๋ณต = ๊ต์ฐจํ ๊ฒฝ์ฐ stop!!
do{
//low๋ฅผ ๋จผ์ ์ฆ๊ฐ์ํค๋ฉด์ ์์
//low๊ฐ right๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ณ && list[low]๊ฐ pivot๋ณด๋ค ์์ ๊ฒฝ์ฐ ๋์ ๋ฐ๋ณต
do{
low++;
}while(low<=right && list[low]<pivot);
//high๋ฅผ ๋จผ์ ์ฆ๊ฐ์ํค๋ฉด์ ์์
//high๊ฐ left๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ && list[high]๊ฐ pivot๋ณด๋ค ํด ๊ฒฝ์ฐ ๋์ ๋ฐ๋ณต
do{
high--;
}while(high>=left && list[high]>pivot);
// ๋ด๋ถ ๋๊ฐ์ do-while ๋ฌธ์ ๊ฑฐ์ณ์ ๋์จ low์ high์ ๊ฐ์์
// low์ high๊ฐ ๊ต์ฐจํ์ง ์๋๋ค๋ฉด, ๋ list[low]์ list[high]์ ๊ฐ์ ๋ฐ๊พธ์ด ์ค๋ค.
if(low<high){
swap(&list[low], &list[high], temp);
}
}while(low<high);
//low์ high๊ฐ ๊ต์ฐจํ์ผ๋ฉด, list๋ฅผ ๋น ์ ธ๋์ list[left](=pivot)๊ณผ list[high]๋ฅผ ๊ตํํ๋ค.
swap(&list[left], &list[high], temp);
return high;
}
void quickSort(int list[], int left, int right){
// ์ ๋ ฌ ๋ฒ์๊ฐ 2๊ฐ์ด์์ ๋ฐ์ดํฐ๋ผ๋ฉด, (๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ์๋๋ฉด)
if(left<right){
// pivot์ ์์น
int pivot_lo = partition(list, left, right);
// pivot์ ์ ์ธํ 2๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ํ ํธ์ถ (= ์ฌ๊ท)
// <<left~pivot์ ๋ฐ๋ก ์>>
quickSort(list, left, pivot_lo-1);
// << pivot์ ๋ฐ๋ก ๋ค~right>>
quickSort(list, pivot_lo+1,right);
}
}
int main(){
int list[9] = {5, 3, 8, 4, 9, 1, 6, 2, 7};
int n = 9;
// ๋ฐฐ์ด์ ์์ = 0, ๋ฐฐ์ด์ ๋ = 9-1=8
quickSort(list,0,n-1);
cout<<"*****quickSort ํ*****"<<endl;
for(int i = 0 ; i < 9 ; i++){
cout<<list[i]<<endl;
}
}
๐ก ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
- ์ฅ์
- ์๋๊ฐ ๋น ๋ฅด๋ค.
- ๋ถํ์ํ ๋ฐ์ดํฐ์ ์ด๋์ ์ค์ด๊ณ ๋จผ๊ฑฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ๋ฟ๋ง ์๋๋ผ,
- ํ ๋ฒ ๊ฒฐ์ ๋ ํผ๋ฒ๋ค์ด ์ถํ ์ฐ์ฐ์์ ์ ์ธ๋๋ ํน์ฑ ๋๋ฌธ์ด๋ค.
- ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์๋๋ค.
- ๋น๊ต๋ง์ ํตํด์ ๊ตฌํ
- O(log n) ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ค.
- ์๋๊ฐ ๋น ๋ฅด๋ค.
- ๋จ์
- ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์๋ ํต ์ ๋ ฌ์ ๋ถ๊ท ํ ๋ถํ ์ ์ํด ์คํ๋ ค ์ํ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
- ํด๊ฒฐ๋ฐฉ๋ฒ : ๋ฆฌ์คํธ ๋ด์ ๋ช๊ฐ์ ๋ฐ์ดํฐ ์ค์์ ํฌ๊ธฐ์์ผ๋ก ์ค๊ฐ ๊ฐ(medium)์ ํผ๋ฒ์ผ๋ก ์ ํ
- ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์๋ ํต ์ ๋ ฌ์ ๋ถ๊ท ํ ๋ถํ ์ ์ํด ์คํ๋ ค ์ํ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
๐ก ํต ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋
ํต ์ ๋ ฌ์ ์ฑ๋ฅ์ ํผ๋ด ์ ํ์ด ์ข์ฐํ๋ค!
- ๊ฐ์ฅ ์์ ์ซ์๋๋ ๊ฐ์ฅ ํฐ ์ซ์๊ฐ ์ ํ๋๋ฉด, ํ๋ถ๋ถ์ผ๋ก ์น์ฐ์น๋ ๋ถํ ์ ์ผ๊ธฐ-> ์ต์ !
1๏ธโฃ ์ต์ ์ ๊ฒฝ์ฐ
- ์ํ ํธ์ถ์ ๊น์ด
- ๋ฐฐ์ด์ ์์๊ฐ์ n์ด 2์ ๊ฑฐ๋ญ ์ ๊ณฑ์ด๋ผ๊ณ ๊ฐ์ ํ์ ( n = 2^k )
- n = 2^3 ์ผ ๊ฒฝ์ฐ, 2^3 -> 2^2 -> 2^1 -> 2^0 ์์ผ๋ก ์ค์ด๋ค์ด ์ํ ํธ์ถ์ ๊น์ด๊ฐ 3์์ ์ ์ ์๋ค.
- n = 2^k ์ผ ๊ฒฝ์ฐ, ์ํ ํธ์ถ์ ๊น์ด๋ k์ด๊ณ k = logโn ์ด๋ค.
- logโn
- ๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์์์ ๋น๊ต ์ฐ์ฐ
- ํ๊ท n ๋ฒ
- ์ด๋ ํ์ = ๋น๊ต ํ์๋ณด๋ค ์ ์ผ๋ฏ๋ก ๋ฌด์ํ ์ ์๋ค.
- ๋น๊ตํ์ = ์ํ ํธ์ถ์ ๊น์ด * ๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ = nlogโn
- ์ต์ ์ ๊ฒฝ์ฐ T(n) = O(nlogโn)
2๏ธโฃ ์ต์ ์ ๊ฒฝ์ฐ
- ๋ฆฌ์คํธ๊ฐ ๊ณ์ ๋ถ๊ท ํํ๊ฒ ๋๋์ด์ง๋ ๊ฒฝ์ฐ ( ํนํ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์ ํต ์ ๋ ฌ์ ์คํํ๋ ๊ฒฝ์ฐ )
- ์ํ ํธ์ถ์ ๊น์ด
- ๋ฐฐ์ด์ ์์๊ฐ์ n์ด 2์ ๊ฑฐ๋ญ ์ ๊ณฑ์ด๋ผ๊ณ ๊ฐ์ ํ์ ( n = 2^k )
- ์ํ ํธ์ถ์ ๊น์ด๋ n
- n
- ๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์์์ ๋น๊ต ์ฐ์ฐ
- ํ๊ท n ๋ฒ
- ์ด๋ ํ์ = ๋น๊ต ํ์๋ณด๋ค ์ ์ผ๋ฏ๋ก ๋ฌด์ํ ์ ์๋ค.
- ๋น๊ตํ์ = ์ํ ํธ์ถ์ ๊น์ด * ๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ = n^2
- ์ต์ ์ ๊ฒฝ์ฐ T(n) = O(n^2)
3๏ธโฃ ํ๊ท
- ํ๊ท T(n) = O(nlogโn)
- ํฌ๊ธฐ๊ฐ n์ธ ๋ฐฐ์ด ์ค ์ด๋ค ํ๋๊ฐ pivot์ผ๋ก ์ ํ๋ ํ๋ฅ = 1/n
- ์ต๋ n ๋ฒ ์ฐ์ฐ์ ์์ n๊ฐ๊ฐ ์งํ = n^2
- ์ด๊ฒ ์ด logโn ๊ฐ์ ์ธต์ผ๋ก ๊ตฌ์ฑ
- 1/n * n^2 * logโn = nlogโn
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์๊ฐ๋ณต์ก๋ ์ ๋ฆฌ
๐ก ํต ์ ๋ ฌ์ ์ฑ๋ฅ ํฅ์ ๋ฐฉ๋ฒ
- ์ ๋ ฅ์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํด๋, ํต ์ ๋ ฌ์ ์ฑ๋ฅ์ ๋ ํฅ์์ํค๊ธฐ ์ํด์ ์ฝ์ ์ ๋ ฌ์ด ๋์์ ์ฌ์ฉ
- ์ ๋ ฅ์ ํฌ๊ธฐ๊ฐ ์์ ๋์๋ ํต ์ ๋ ฌ์ด ์ฝ์ ์ ๋ ฌ๋ณด๋ค ๋น ๋ฅด์ง๋ง์ ์๋ค. ์๋ํ๋ฉด ์ฌ๊ทํธ์ถ๋ก ์ํ๋๊ธฐ ๋๋ฌธ!
- ๋ถ๋ถ๋ฌธ์ ์ ํฌ๊ธฐ๊ฐ ์์์ง๋ฉด ๋์ด์์ ๋ถํ (์ฌ๊ทํธ์ถ)์ ์ค๋จํ๊ณ ์ฝ์ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
+ ์์ฉ
- ํต ์ ๋ ฌ์ ์ปค๋ค๋ ํฌ๊ธฐ์ ์ ๋ ฅ์ ๋ํด์ ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ ๋ณด์ด๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ค์ง์ ์ผ๋ก ์ด๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
- ์๋ฌผ ์ ๋ณด ๊ณตํ์์ ํน์ ์ ์ ์๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐพ๋๋ฐ ์ ๋ฏธ ๋ฐฐ์ด๊ณผ ํจ๊ป ํต ์ ๋ ฌ์ด ํ์ฉ๋๋ค.
Reference
- ์ํค๋ฐฑ๊ณผ
- heejeong Kwon์ ๋ธ๋ก๊ทธ
[์๊ณ ๋ฆฌ์ฆ] ํต ์ ๋ ฌ(quick sort)์ด๋ - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.06 |
---|---|
[Algorithm] ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ (0) | 2021.10.06 |
[Algorithm] ์ ํ๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ (feat. Quick-Sort) (0) | 2021.09.29 |
[Algorithm] ํฉ๋ณ์ ๋ ฌ (Merge sort) (0) | 2021.09.28 |
[Algorithm] ํผ๋ณด๋์นํจ / Fiona-chicken (0) | 2021.09.11 |