[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํต์ ๋ ฌ(Quick Sort)
ํต์ํธ
ํต ์ ๋ ฌ์ ์ด๋ฆ ๊ทธ๋๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ ๋ ฌ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถํ ์ ๋ณต์ ์ฑ๊ฒฉ์ ๊ฐ์ง๊ณ ์๊ณ ์ค์ ๋ก๋ ๋ง์ด ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋์์ ์๋ฃ๊ตฌ์กฐ ์๊ฐ์๋ค์ ๊ดด๋กญ๊ฒ ํ๋ ์น๊ตฌ ์ค ํ๋ช ์ด๊ธด ํ์ง๋ง..
Algorithm Concept
ํต ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์ ๋ ฌ์ ์งํํ๋ค. ์ ๋ ฌ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์งํํ๋ค๊ณ ๊ฐ์ ํ์.
- ์ฃผ์ด์ง ๋ฐฐ์ด์์ ํ๋์ ์์๋ฅผ ์ ํํ๊ณ ์ด๋ฅผ pivot(ํผ๋ฒ) ์ผ๋ก ์ผ๋๋ค.
- ๋ฐฐ์ด ๋ด๋ถ์ ๋ชจ๋ ๊ฐ์ ๊ฒ์ฌํ๋ฉด์ ํผ๋ฒ ๊ฐ๋ณด๋ค ์์ ๊ฐ๋ค์ ์ผ์ชฝ์, ํฐ ๊ฐ๋ค์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์นํ๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๋ฐฐ์ด์ด ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค. ๋๋ ์ด ๋ ๊ฐ์ ๋ฐฐ์ด์์ ๊ฐ๊ฐ ์๋ก์ด ํผ๋ฒ์ ๋ง๋ค์ด์ ๋๊ฐ์ ๋ฐฐ์ด๋ก ๋ค์ ์ชผ๊ฐ์ด ์ค๋ค.
- ๋ ์ด์ ๋ฐฐ์ด์ ์ชผ๊ฐค ์ ์์ ๋๊น์ง ์งํํ๋ค.
์ด ๊ณผ์ ์ ๋ถํ ์ ๋ณต์ ์๋ฆฌ๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค. ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ๋ฌธ์ ๋ฅผ ๋ถํ
ํ๊ณ , ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ํด์ ์์ ๊ฐ๊ณผ ํฐ ๊ฐ์ ๋์ดํ๋ ์ ๋ณต
๊ณผ์ ์ ๊ฑฐ์น ๋ค, ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉ
ํด์ ํฐ ์ ์ฒด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
Pivot Selection
ํต์ ๋ ฌ์์ ๊ฐ์ฅ ํต์ฌ์ด ๋๋ ๋ถ๋ถ์ ์ด๋ป๊ฒ pivot์ ์ ์ ํ๋์ง์ ๋ํ ๋ถ๋ถ์ด๋ค. ํต์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ์ ์๊ฐ๋ณต์ก๋๋ O(N2) ์ด๊ณ ํ๊ท ๋ณต์ก๋๋ ๐ฉ(NlogN) ์ด๊ธฐ ๋๋ฌธ์ ํผ๋ฒ๊ฐ์ ์๋ชป ์ ์ ํ๋ฉด ๋ฒ๋ธ์ํธ๋ ๋ค๋ฆ์๋ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
ํผ๋ฒ์ ๋ฐ๋ผ ์๊ฐ๋ณต์ก๋๊ฐ ๊ทน๊ณผ๊ทน์ธ ์ด์ ๋ ํผ๋ด์ ํตํด ๋๋๋ ๋ฐฐ์ด์ ์์น ๋๋ฌธ์ด๋ค. ๋ง์ฝ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด๋ ์ญ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ด ์๋ค๊ณ ํ์. ์ด๋ ๊ฐ์ฅ ์ฒ์๊ฐ์ ํผ๋ฒ์ผ๋ก ์ผ๊ฒ๋๋ฉด ํต์ํธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๋ค.
| 1 | 2 | 3 | 4 | 5 |
์ด๋ฐ ๋ฐฐ์ด์ด ์์๋, 1์ ํผ๋ฒ์ผ๋ก ์ ํํ๊ฒ ๋๋ฉด,- 1์ ๊ธฐ์ค์ผ๋ก 1๋ณด๋ค ์์ ๊ฐ์ ๋ชจ๋ ์ผ์ชฝ์ ๋๊ณ ํฐ ๊ฐ์ ๋ชจ๋ ์ค๋ฅธ์ชฝ์ ๋์ด์ผ ํ๋๋ฐ, 1๋ณด๋ค ์์ ๊ฐ์ ์๊ธฐ ๋๋ฌธ์, 5๋ถํฐ 2๊น์ง ๋ด๋ ค์ค๋ฉด์ 1๊ณผ ๋น๊ตํ๋ ์ฐ์ฐ์ด n-1๋ฒ ์ํ๋๋ค.
- ์ฒซ ๋ถํ ์ด ๋๋๊ณ ๋๋ฉด ๋ค์ ํผ๋ฒ์ 2๋ก ์ง์ ์ด ๋ ํ ๋ฐ ์ด ๋ ์ญ์ ๋น๊ตํ๋ ์ฐ์ฐ์ด n-1๋ฒ ์ํ๋๋ค.
- ๋ฐ๋ผ์ ํผ๋ฒ์ด n์ ๋๋ฌํ ๋๊น์ง ๋น๊ต์ฐ์ฐ์ด ๊ณ์ ์งํ๋๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋
n-1 * n
์ด ๋์ด์ O(N^2) ๊ฐ ๋๊ฒ๋๋ค.
๋ฐ๋ฉด์ ๋ฐฐ์ด์ด ์ ํํ๊ฒ ํน์ ๊ฑฐ์ ๊ทผ์ฌํ๊ฒ ๋ฐ์ผ๋ก ๊ณ์ ๋๋์ด์ง๋ค๋ฉด ๋ฐฐ์ด์ ์์ ๊ฐฏ์๋ก ๋ง๋ค์ด์ง๋ ์์ ์ด์งํธ๋ฆฌ์ ๋์ด์ธ log n ์ ๋ํด ๋น๊ต์ฐ์ฐ์ด n๋ฒ ์ํ๋๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ ๐ฉ(nlogn) ์ด ๋๋ค.
์ด๋ฐ ๋ฌธ์ ์ ์๋ ๋ถ๊ตฌํ๊ณ ํต์ํธ๊ฐ ์ฌ์ ํ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ธ์ ๋ฐ๋ ์ด์ ๋ ์์ ํ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ํด ํต์ ๋ ฌ์ ์ํํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ์ ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ํผ๋ด์ ์ด๋ป๊ฒ ์ ํด์ผ์ง ์ต๋ํ ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆด ์ ์์๊น? ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฌ์ ์ํํ๊ธฐ ์ํด ๋ฐ๋ ๋ฐ์ดํฐ์ ๋ด๋ถ ์์๋ค์ด ์ด๋ป๊ฒ ๋ฐฐ์น๋์ด ์๋์ง ์์ง ๋ชปํ์ฑ๋ก ์ ๋ ฌ์ ์ํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ฐ๋ผ์ ์๋ฌด๋ฆฌ ์ต์ ์ ๊ฒฝ์ฐ๊ฐ ์ผ์ด๋ ํ๋ฅ ์ด ์ ๋ค๊ณ ํด๋ ํผ๋ด์ ์ ์ ์ ํด์ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ํผํ๋ ๊ฒ์ ํ์ํ ๊ฒ์ด๋ค. ํผ๋ด์ ์ ์ ์ ๋ํ์ ์ผ๋ก ์ธ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋๋๋ค.
- ์ฒซ๋ฒ์งธ ๊ฐ์ด๋ ๋ง์ง๋ง ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ์ ํ๋ค.
- ์ฒซ๋ฒ์งธ ๊ฐ, ๊ฐ์ด๋ฐ ๊ฐ, ๋ง์ง๋ง ๊ฐ ์ค์ ์ค๊ฐ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ์ ํ๋ค.(Median of Three)
- ๋ฌด์์ ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ์ ํ๋ค.
Median of Three ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ๋ถํ ์ด ๊ฑฐ์ ์ด๋ฑ๋ถ์ผ๋ก ์ ์ง๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ข์ ํผ๋ฒ ์ ์ ๋ฒ์ด๋ผ๊ณ ์๋ ค์ ธ์๋ค. ๊ทธ๋ฌ๋ ์ด ํฌ์คํธ์์๋ ํต์ํธ์ ์๋ฆฌ์ ๊ณผ์ ์ ์ดํดํ๊ธฐ ๊ฐ์ฅ ์ฉ์ดํ ์ฒซ๋ฒ์งธ ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ช ์ ์ด์ด๊ฐ๋๋ก ํ๊ฒ ๋ค.
Example
ํต์ํธ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ธํ ์์๋ณด์.
Phase 1
์ผ๋จ ํผ๋ด์ ์ ์ ํ๊ณ ํผ๋ฒ๋ณด๋ค ๋ ์์๊ฐ๊ณผ ๋ ํฐ ๊ฐ์ ํ์ํ low ์ high ๋ฅผ ํผ๋ฒ์ ์ ์ธํ ๋ฐฐ์ด์ ์๋์ ์ ๋๋ค.
Phase 2
๋จผ์ low๋ฅผ ๊ณ์ ์์ง์ด๋ฉด์ ๋ฐฐ์ด ์์๋ฅผ ๊ฒ์ฌํด๋ณด์. ํ์นธ ์ด๋ํ์ ๋ low๋ ๋ฐฐ์ด์์ 9๋ฅผ ๋ง๋๊ฒ ๋๋๋ฐ, ์ด ๊ฐ์ ํผ๋ฒ๊ฐ์ธ 5๋ณด๋ค ํฐ ๊ฐ์ด๋ค. low์ ๋ค์๋ ํญ์ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ผ๋จ ๋ฉ์ถ๋ค.
Phase 3
low๊ฐ ๋ฉ์ถ๋ฉด high๋ฅผ ์์ง์ธ๋ค. high๋ฅผ ํ์นธ ์ฎ๊ธฐ๋ฉด ๋ฐฐ์ด ์์ 1์ ๋์ฐฉํ๊ฒ ๋๋๋ฐ ์ด ๊ฐ์ ํผ๋ฒ๊ฐ์ธ 5๋ณด๋ค ์์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ high์ ์์ญ์ ์์ผ๋ฉด ์๋๋ค. high ๋ ์ฌ๊ธฐ์ ์ผ๋จ ์ ์ง์ํจ๋ค.
Phase 4
low ์ high๊ฐ ๋ชจ๋ ์ค๋จ๋๋ฉด ์ค๋จ๋ ์์น๋ฅผ ๋จผ์ ํ์ธํด๋ณธ๋ค. ๋ง์ฝ low ์ high๊ฐ ์๋ก ์์น๊ฐ ์ญ์ ๋ ์ํ๊ฐ ์๋๋ผ๋ฉด ์ค๋จ๋ ์ง์ ์ ์๋ ๋ ์์๋ฅผ ๊ตํํ๋ค. ๋ฐ๋ผ์ 1๊ณผ 9๊ฐ ๊ตํ๋์๋ค.
Phase 5
๋ค์ low๋ฅผ ์ด๋์ํจ๋ค. ์ด๋ฒ์๋ ์ญ์ ํ์ธํ ๋ฐฐ์ด์์๊ฐ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค๋จํ๋ค.
Phase 6
์ด์ high ๋ฅผ ์ด๋์ํค์. high๋ ์๋ก ๊ฒ์ฌํ ๋ฐฐ์ด์ ์์๊ฐ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ ์์น์์ ์ค๋จํ๋ค.
Phase 7
low ์ high ๊ฐ ์์ง ๊ต์ฐจํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฐฐ์ด ์์๋ฅผ ๊ตํํ๋ค.
Phase 8
low๊ฐ ํ๋ฒ ๋ ์ด๋ํ๋ฉด ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ ์ค๋จํ๊ฒ ๋๋ค.
high๋ ํ๋ฒ ๋ ์ด๋ํ๋ฉด ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ๋ง๋๊ธฐ ๋๋ฌธ์ ์ค๋จํ๊ฒ ๋๋ค.
์ด๋ฒ ๊ฒฝ์ฐ์๋ low์ high์ ์์น๊ฐ ์ญ์ ๋๊ธฐ ๋๋ฌธ์ ๊ตํ๋์ง ์๊ณ ์ ๋ ฌ์ ๋๋ธ๋ค.
Phase 9
1์ฐจ๋ก ์ ๋ ฌ์ด ๋๋๋ฉด ํผ๋ฒ์ผ๋ก ์ค์ ๋ ๋ฐฐ์ด์์๋ฅผ high๊ฐ ๊ฐ๋ฅดํค๋ ๋ฐฐ์ด์์์ ๊ตํํด์ค๋ค. ์ด์ ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ํผ๋ฒ๋ณด๋ค ์๊ณ ํฐ ๊ฐ๋ค์ด ์์นํ์์ ํ์ธํ ์ ์๋ค.
More...
ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ๋๋์ด์ง ๋ ๊ทธ๋ฃน์ ๋ ๊ฐ์ ๋ฐฐ์ด์ฒ๋ผ ์ทจ๊ธ๋์ด์ ์์์ ๊ฑฐ์ณค๋ ๊ณผ์ ์ ๋๊ฐ์ด ๊ฑฐ์น ์ ์๋ค. low๊ฐ ๋ง๋ค์ด๋ธ ๊ทธ๋ฃน์ ํผ๋ฒ์ 3์ด ๋ ๊ฒ์ด๊ณ , high ๊ฐ ๋ง๋ค์ด๋ธ ๊ทธ๋ฃน์ ํผ๋ฒ์ 7์ด ๋ ๊ฒ์ด๋ค. ์ด ์์ ์ ๋ถํ ๋ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ด๋ 0์ด ๋ ๋๊น์ง ๊ณ์ ๋ฐ๋ณตํ๋ค.
Implementation
#include <stdio.h>
int partition (int arr[], int p, int r){
int low, high;
int pivot = arr[p]; // pivot ๊ฐ ์ค์
low = p + 1; // low ๋ pivot์ ๋ฐ๋ก ๋ค์ ์์น์์๋ถํฐ
high = r; // high๋ ์ ๋ฌ๋ ๋์ง์
while(low <= high){
while(arr[low] < pivot) low++; // pivot ๋ณด๋ค ์์ ๊ฐ์ด ๋์ฌ๋๋ง๋ค ์ด๋
while(arr[high] > pivot) high--; // pivot ๋ณด๋ค ํฐ ๊ฐ์ด ๋์ฌ๋๋ง๋ค ์ด๋
if (low <= high){ // low์ high ๊ฐ ์ค๋จ๋ ์ง์ ์ด ์๋ก ์์น๊ฐ ์ญ์ ๋ ์ง์ ์ด ์๋๋ผ๋ฉด
int temp = arr[low]; // low ์ high ์ ๊ฐ ๋ณ๊ฒฝ
arr[low] = arr[high];
arr[high] = temp;
}
}
// ํผ๋ฒ๊ณผ high ์์น ๊ตํ
int temp = arr[p];
arr[p] = arr[high];
arr[high] = temp;
return high; // ํผ๋ฒ ์์น ๋ฐํ
}
void quick_sort(int arr[], int left, int right){
if (left < right){
int pivot = partition(arr, left, right);
quick_sort(arr, left, pivot-1); // ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฐฐ์ด ์ ๋ ฌ
quick_sort(arr, pivot+1, right); // ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ ๋ฐฐ์ด ์ ๋ ฌ
}
}
int main (){
int arr [] = {3, 2, 1, 5, 7, 9, 6};
quick_sort(arr, 0, sizeof(arr)/sizeof(arr[0])-1);
for (int i = 0 ; i < sizeof(arr)/sizeof(arr[0]) ; i++){
printf("%d ", arr[i]);
}
}
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํฉ๋ณ์ ๋ ฌ(Merge Sort) (0) | 2021.07.18 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ณ์์ ๋ ฌ(Counting Sort) (3) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ(Floyd-Warshall Algorithm) (0) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์์์ ๋ ฌ(Topological Sort) (0) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] DAG์์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฒ (0) | 2021.07.18 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote