1. Quick ์ ๋ ฌ์ ๋ฌด์์ธ๊ฐ?
Pivot(์ค์ถ)
๊ฐ ๋๋ ๊ฐ์ ํ๋ ์ ์ ํด์ ๊ทธ ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ์ผ๋ก, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ชจ์๋ค. ์ด์ ๋๋ ์ง ๋ ๊ทธ๋ฃน ๋ด์์ ๋ค์ Pivot์ ์ ์ ํ๊ณ ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ๊ฐ์ ๋ ์ด์ ์ชผ๊ฐค ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ฉด ๋ชจ๋ ๊ฐ์ด ์ ๋ ฌ๋์ด ์๋ค.
2. ์๋ฆฌ
๋ณํฉ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถํ ์ ๋ณต์ ํ์ฉํ๋ ๋ ๋ค๋ฅธ ์์์ด๋ค. ๋ณํฉ ์ ๋ ฌ์์๋ ์ ๋ถํ ํ ์ ๋ณต ์ด์๋ค๋ฉด, quick ์ ๋ ฌ์ ์ ์ ๋ณต, ํ ๋ถํ ํ์์ด๋ผ ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
์ ๋ณต์๋ ๋ง์ฃผ๋ณด๋ ํฌ ํฌ์ธํฐ๊ฐ ํ์ฉ๋๋ค. ์ด๋ป๊ฒ ์ฐ์ด๋์ง๋ ๋ฐ์ ์์์์ ์์ธํ ์ค๋ช ํ๊ฒ ๋ค.
- (1) Pivot ์ ํ๊ธฐ (์ ํ๋ ๋ฐฉ์์ ๋์ ๋ง๊ฒ ์์ )
- (2) Pivot๋ณด๋ค ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ชฐ๊ธฐ, ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ์ผ์ชฝ์ผ๋ก ๋ชฐ๊ธฐ (์ ๋ณต by
ํฌ ํฌ์ธํฐ
) - (3) ๋๋ ์ง ๋ ๊ทธ๋ฃน์ ๋ํด์ ์ฌ๊ท๋ฅผ ํ์ฉํด (1),(2)๋ฒ ๋ค์ ์งํ - ๋ ์ด์ ์ฌ๊ทํ ์ ์์ ๋๊น์ง (๋ถํ by
์ฌ๊ท
)
(2)๋ฒ์ ์ข ๋ ์ธ์ธํ๊ฒ ์ค๋ช ํ๋ฉด,
L(์ผ์ชฝ)
ํฌ์ธํฐ, R(์ค๋ฅธ์ชฝ)
ํฌ์ธํฐ๊ฐ ์์ ๋,
- (2-1)
L
ํฌ์ธํฐ๋ pivot๋ณด๋ค ์์ ๊ฐ์ ๋ง๋๋ฉด ํ ์นธ ์ ์ง, ๊ทธ ์ธ์ ๊ฒฝ์ฐ ๊ทธ ์์น์์ ๊ธฐ๋ค๋ฆผ. - (2-2)
R
ํฌ์ธํฐ๋ pivot๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋๋ฉด ํ ์นธ ์ ์ง, ๊ทธ์ธ์ ๊ทธ ์์น์์ ๊ธฐ๋ค๋ฆผ. - (2-3) ๋ ํฌ์ธํฐ ๋ชจ๋
๊ธฐ๋ค๋ฆผ
์ํ๋ผ๋ฉด ๋์ value๋ฅผ ์๋ฆฌ ๊ต์ฒด - (2-4) ๊ต์ฒด ํ์๋ ๋ ๋ค ํ ์นธ์ฉ ์ ์ง!!
- (2-5) ์ด ํ์๋ฅผ ๋ ํฌ์ธํฐ๊ฐ ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณต
3. ์์
pivot ๊ฐ์ index = 4์ธ 6
์ผ๋ก ์ ํด๋ณด์. ์ค์์ ๊ฐ์ผ๋ก ์ ํด์ ๋ฐ๋ก ๊ฐ์ ์ค์์ ์์น์ํฌ ํ์๋ ์๋ค.
์ด์ ๋ง์ฃผ๋ณด๋ ํฌ ํฌ์ธํฐ๋ฅผ ์ค์ ํ๋ค.
index = 0
์ ๊ฐ์ 1๋ก 6๋ณด๋ค ์๋ค. ๋ฐ๋ผ์ ์ผ์ชฝ ํฌ์ธํฐ๋ ํ ์นธ ์ ์งํ๋ค. ๋ฐ๋ฉด ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ index = 9
์ ๊ฐ์ 3์ผ๋ก 6๋ณด๋ค ์๋ค. ์ด๋ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ Switching ํ ๊ฐ์ ๋ง๋ ๋๊น์ง ๋๊ธฐํด์ผํ๋ค.
์ผ์ชฝ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ด 7๋ก 6๋ณด๋ค ํฌ๋ค. ๋ฐ๋ผ์ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ์ 3๊ณผ ๊ฐ์ switching
ํด์ค๋ค.
์ด๋ฐ ์์ผ๋ก ๋ ํฌ์ธํฐ๊ฐ ๋ง๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
L ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ pivot: 6
๊ณผ ํฌ๊ธฐ๊ฐ ๋์ผํ ๊ฐ์์ผ๋ก ์ ์ง์ํ, R ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ pivot๋ณด๋ค ๊ฐ์ด ์์์ผ๋ก ๊ธฐ๋ค๋ฆฌ๋ ์ํ. ์๋ก ๊ธฐ๋ค๋ฆฌ๋ ์ํ๋ผ์ ์๋ฆฌ๊ต์ฒด (์๋ฆฌ ๊ต์ฒด ํ์๋ ๋ชจ๋ ํ ์นธ ์ ์ง!)
๋ ํฌ์ธํฐ๊ฐ ์๊ฐ๋ ธ์์ผ๋ก ํ ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ.
์ดํ ๋ถํ ์ START - R
, L - END
๋๊ฐ๋ก ๋๋ ์ ํ๋ค.
Pivot์ด ๋ค์ ์ ๋ ฌ ๊ทธ๋ฃน ์์ ํฌํจ๋์ด๋ ๊ด์ฐฎ๋์? ๐ค
์์ ์์๋ฅผ ๋ณด๋ฉด Pivot์ด ์์ ๋ณด๋ค ํฐ ๊ฐ๋ค์ด ์ํ๋ ๊ทธ๋ฃน์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด์ฒ๋ผ PIVOT
์ ์ผ์ชฝ ๊ทธ๋ฃน์์๋ ์ ์ผ ํฐ ๊ฐ, ์ค๋ฅธ์ชฝ ๊ทธ๋ฃน์์๋ ์ ์ผ ์์ ๊ฐ์ผ๋ก ๋ค์ ์ ๋ ฌ์ ์ฐธ์ฌํ๊ฒ ๋๋ฏ๋ก ์ ๋ ฌ์ ํฌํจ๋์ด๋ ๋ฑํ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
๋ง์ฝ ๋ฌธ์ ๋ฅผ ํ ๋, PIVOT
์ด ์ ๋ ฌ์ ํฌํจ๋จ์ ๋ฐ๋ผ ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค๊ณ ์๊ฐํ๋ค๋ฉด, PIVOT
์ ์ต์ข๋จ์ผ๋ก ๋บด๋๋ ๋ฐฉ์์ ํ์ฉํ๋ฉด ๋๋ค. ํด๋น ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๋ค.
- (1) PIVOT์ ์ ์ ํ, ํญ์ ์ต์ข๋จ ๊ฐ๊ณผ ์๋ฆฌ ๊ต์ฒดํจ
- (2) ์ ๋ ฌ์ ๋๊ฐ์ด ์งํ
- (3) ์ ๋ ฌ์ด ๋๋ ํ, R ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ๊ณผ Pivot์ ๊ต์ฒด (PIVOT์ ์ ๋ ฌ๋ ๊ทธ๋ฃน์ ๊ฐ์ด๋ฐ์ ์์น)
- (4) Pivot ์ ์ธํ๊ณ , ๊ฐ ๊ทธ๋ฃน์์ ์ฌ๊ท๋ฅผ ํ์ฉํ ์ ๋ ฌ ์ฌ ์งํ
ํด๋น ๋ฐฉ์์ ์ฝ๋ ๋ํ ๋ฐ์ ๋ฐ๋ก ์ ์ด๋๊ฒ ๋ค.
4. ์ฝ๋
(1) PIVOT ํฌํจ ์ ๋ ฌ
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int [] arr = new int [] {1,7,5,4,6,9,8,10,2,3};
static int [] tmp = new int [10];
public static void main(String[] args) throws IOException {
quick_sort(0, 9, 0);
System.out.println(Arrays.toString(arr));
}
public static void quick_sort (int start, int end, int depth) {
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(start >= end) return;
// 1. ์ ๋ณต by ํฌ ํฌ์ธํฐ
int pivot_index = start + (end - start)/2;
int pivot = arr[pivot_index];
int L = start;
int R = end;
while (L <= R){
while (arr[L] < pivot){
L++;
}
while (arr[R] > pivot){
R--;
}
if(L <= R){ // == ์ฒ๋ฆฌ ์ํ๋ฉด ์์ํ ๋ ํฌ์ธํฐ๊ฐ ์๊ฐ๋ฆฌ์ง ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ์๊น
int tmp = arr[L];
arr[L] = arr[R];
arr[R] = tmp;
L++; R--;
}
}
System.out.println("depth-" + depth + ": " + Arrays.toString(arr) + " / [[ pivot: " + pivot + " start: "+ start + " end: " + end + "]]");
// 2. ๋ถํ by ์ฌ๊ท
quick_sort(start, R, depth+1);
quick_sort(L, end, depth+1);
}
}
(2) PIVOT์ ์ ๋ ฌ์์ ์ ์ธ
private static void quick_sort (int start, int end) {
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(end - start == 1){
swap(start, end);
}
if(start >= end) return;
// 1. ๋ณธ๊ณ์ฐ
int pivot = start + (end - start)/2;
int pivot_value = arr[pivot];
swap(pivot, start); // pivot์ ์ต์ข๋จ์ผ๋ก ๋ชฐ์์ ๊ณ์ฐ์ ์ํฅ ์ ์ฃผ๊ธฐ
int L = start+1; int R = end;
while (L <= R) {
while (L <= end && arr[L] < pivot_value) L++; // ์๋๋ ์ค๊ฐ์ pivot์ด ์์ด์ L, R ํฌ์ธํฐ๊ฐ ๊ทน๋จ๊น์ง ์ ๊ฐ๊ณ ๋ฌด์กฐ๊ฑด ๋ฉ์ท์ง๋ง, ์ด์ ๊ทธ๋ฐ ๋ธ๋ ์ดํฌ๊ฐ ์กด์ฌํ์ง ์๊ธฐ์, ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋๋ก ์กฐ์นํด์ค์ผ ํจ.
while (R >= 0 && arr[R] > pivot_value) R--;
if(L <= R) {
swap(L,R);
L++; R--;
}
}
swap(start, R);
// pivot ์ ์ธ ๋ถํ ๋ฐ ์ฌ์ ๋ณต
quick_sort(start, R-1);
quick_sort(L, end);
}
private static void swap(int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
์๊ฐ๋ณต์ก๋
๋ O(\(N^{2}\))์ด๋ค.
๋งค๋ฒ pivot์ ์ต๋๊ฐ ํน์ ์ต์๊ฐ์ผ๋ก ์ ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด, ํ ๋ฒ์ ์ฌ๊ท์์ ๋ฑ ํ ๊ฐ๋ง ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค. ์ฌ๊ท ํ ๋ฒ ๋น ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ํ + ํ๋๋ง ์ ๋ ฌ ๋จ์ผ๋ก \(N^{2}\)๊ฐ ๋๋ค.