ํต์ ๋ ฌ์ด๋?
ํต์ ๋ ฌ(Quick-Sort)์ ํ๊ท ์๋ (NlogN)์ ์๋ํ๋ ๋งค์ฐ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ถํ ์ ๋ณต(Divide & Conquer) ์๊ณ ๋ฆฌ์ฆ์ ํ๋๋ก ๋ค๋ฅธ ์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต ์ ๋ ฌ์ ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ ๋ ฌ๊ณผ์
ํต์ ๋ ฌ์ ์์ด์ ํผ๋ด(pivot)์ ๊ธฐ์ค์ผ๋ก ์ข์ธก์๋ ํผ๋ด๋ณด๋ค ์์ ๊ฐ์ ๋๊ณ ์ฐ์ธก์๋ ํผ๋ด๋ณด๋ค ํฐ ๊ฐ์ ๋๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌํ๋ค.
- ํผ๋ด์ ์ ํํ๋ค.
- left๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ด๋ณด๋ค ๋ ํฐ ์๋ฅผ ์ฐพ๋๋ค.
- right๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ด๋ณด๋ค ๋ ์์ ์๋ฅผ ์ฐพ๋๋ค.
- ์ฐพ์ ์ง์ ์์ left์ right๋ฅผ ๊ตํํ๋ค.
- ์ ๊ณผ์ ์ left๋ right๊ฐ ๋ฐ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- left๋ right๊ฐ ๋ฐ๋๋ฉด ํผ๋ด๊ณผ right๋ฅผ ๊ตํํ๋ค.
- ์ ๊ณผ์ ์ ๊ฑฐ์น๊ณ ๋๋ฉด ํผ๋ด์ ์ผ์ชฝ์๋ ํผ๋ด๋ณด๋ค ์์ ์๊ฐ, ํผ๋ด์ ์ค๋ฅธ์ชฝ์๋ ํผ๋ด๋ณด๋ค ํฐ ์๊ฐ ์์นํ๋ค.
- ํผ๋ด์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ ๋ ๊ฐ๋ก ๋๋ ๊ณผ์ ์ ๋ฐ๋ณต ์ํํ๋ค.
- ํด๋น ๊ณผ์ ์ ์ํํ๋ฉด ๋ถํ ๋ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ๋๋ฉด ์ํ์ ์ข ๋ฃํ๋ค.
ํต์ ๋ ฌ ์ฅ๋จ์
์ฅ์
- ์๋๊ฐ ๋น ๋ฅด๋ค. ํน์ ์ํ๊ฐ ์๋ ์ด์ ํ๊ท ์๊ฐ ๋ณต์ก๋๋ nlogn์ด๋ฉฐ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค. (๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ธ merge sort์ ๋นํด์ 2~3๋ฐฐ ๋น ๋ฅด๋ค)
- ์ถ๊ฐ์ ์ธ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ์ง ์์ผ๋ฉฐ ์ฌ๊ท ํธ์ถ ์คํ ํ๋ ์์ ์ํ ๊ณต๊ฐ ๋ณต์ก๋๋ logn์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์๋นํ๋ค.
๋จ์
- ๋ถ์์ ์ ๋ ฌ์ด๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๊ฐ O(n^2)์ด๋ค.
- ํน์ ์กฐ๊ฑดํ์ ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ๊ฒ ๋จ์ด์ง๋ค.
- ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด์๋๋ฐ ํผ๋ด ๊ฐ์ ๋ฐฐ์ด์ ์ฒซ index๋ก ์ก๋ ๊ฒฝ์ฐ..๋ฑ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์๊ฐ๋ณต์ก๋๊ฐ O(n^2)์ด๋ค.
์์ค์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int number = 10; //๋ฐ์ดํฐ์ ๊ฐ์
static int[] arr = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9}; //์ ๋ ฌํ ๋ฐฐ์ด
public static void main(String[] args) throws IOException {
quickSort(arr, 0, number - 1);
}
static void quickSort(int[] arr, int start, int end) {
if (start >= end) {
return; //์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ
}
int pivot = start; //pivot๊ฐ์ ์ฒซ๋ฒ์งธ ์์
int i = start + 1; //์์์ - ์ผ์ชฝ๋ถํฐ ํฐ ๊ฐ์ ์ฐพ์ ๋ ์์ํ๋ ์ธ๋ฑ์ค
int j = end; //๋์ฐฉ์ - ์ค๋ฅธ์ชฝ๋ถํฐ ์์ ๊ฐ์ ์ฐพ์ ๋ ์์ํ๋ ์ธ๋ฑ์ค
int temp; //์๋ฅผ ๋ฐ๊ฟ ๋ ์ฌ์ฉํ๋ ์์ ๋ณ์
while (i <= j) { // ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณต
while (arr[i] <= arr[pivot]) { //pivot๋ณด๋ค ๋ ํฐ ๊ฐ์ ๋ง๋ ๋๊น์ง
i++;
}
while (arr[j] >= arr[pivot] && j > start) { //pivot๋ณด๋ค ๋ ์์ ๊ฐ์ ๋ง๋ ๋๊น์ง
j--;
}
if (i > j) { //ํ์ฌ ์๊ฐ๋ฆฐ ์ํ๋ฉด pivot๊ฐ๊ณผ ๊ต์ฒด
temp = arr[j];
arr[j] = arr[pivot];
arr[pivot] = temp;
} else { //์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด i์ j๋ฅผ ๊ต์ฒด
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//๋ถํ ๋ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋๋ค ํต ์ ๋ ฌ ์ํ
quickSort(arr, start, j - 1);
quickSort(arr, j + 1, end);
}
}
๋ง์ฝ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ค๋ฉด
import java.io.*;
import java.util.*;
public class Main {
static int number = 10; //๋ฐ์ดํฐ์ ๊ฐ์
static int[] arr = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9}; //์ ๋ ฌํ ๋ฐฐ์ด
public static void main(String[] args) throws IOException {
quickSort(arr, 0, number - 1);
}
static void quickSort(int[] arr, int start, int end) {
if (start >= end) {
return; //์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ
}
int pivot = start; //pivot๊ฐ์ ์ฒซ๋ฒ์งธ ์์
int i = start + 1; //์์์ - ์ผ์ชฝ๋ถํฐ ํฐ ๊ฐ์ ์ฐพ์ ๋ ์์ํ๋ ์ธ๋ฑ์ค
int j = end; //๋์ฐฉ์ - ์ค๋ฅธ์ชฝ๋ถํฐ ์์ ๊ฐ์ ์ฐพ์ ๋ ์์ํ๋ ์ธ๋ฑ์ค
int temp; //์๋ฅผ ๋ฐ๊ฟ ๋ ์์ ๋ณ์
while (i <= j) { // ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณต
while (arr[i] >= arr[pivot]) { //pivot๋ณด๋ค ๋ ํฐ ๊ฐ์ ๋ง๋ ๋๊น์ง
i++;
}
while (arr[j] <= arr[pivot] && j > start) { //pivot๋ณด๋ค ๋ ์์ ๊ฐ์ ๋ง๋ ๋๊น์ง
j--;
}
if (i > j) { //ํ์ฌ ์๊ฐ๋ฆฐ ์ํ๋ฉด pivot๊ฐ๊ณผ ๊ต์ฒด
temp = arr[j];
arr[j] = arr[pivot];
arr[pivot] = temp;
} else { //์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด i์ j๋ฅผ ๊ต์ฒด
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//๋ถํ ๋ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋๋ค ํต ์ ๋ ฌ ์ํ
quickSort(arr, start, j - 1);
quickSort(arr, j + 1, end);
}
}
์ค๊ฐ๋ถ๋ถ ํผ๋ด๊ณผ ๋น๊ตํ๋ ์ฝ๋๋ง ๋ฐ๊พธ๋ฉด ๋๋ค.
reference