1. ๋ฌธ์ ์ค๋ช ๐
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: QUICK SORTING
์ฌ์ค JAVA ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ Sorting์ ์ฐ๋ฉด ๊ฐ๋จํ ํด๊ฒฐ๋๋ ๋ฌธ์ ์ด์ง๋ง, Qucik Sorting ์ฐ์ต์ ์ํด Quick Sorting์ ์ฌ์ฉํด ๋ณด์๋ค. quick sorting์ ๊ฒฝ์ฐ, ์ต์ ์ ์๊ฐ ๋ณต์ก๋๊ฐ O( $N^2$ )์ด๋ผ์ ๋ฌธ์ ์ ์ ์๋ ์ต๋ ๋ฐ์ดํฐ ๋์ ๋ณด๋ฉด, ์๊ฐ์ด๊ณผ๊ฐ ๋์ผ ํ๋ ๊ฒ์ด ๋ง๋ค. (์๋ง Quick Sorting์ ์ฐ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ๋ฃ์ด๋์ ๊ฒ ๊ฐ๋ค.)
(1) ํฐ ํ๋ฆ
- (1) ํ์ฌ ์ ๋ ฌํด์ผ ํ๋ ์์ญ์ ์ค์๊ฐ์
PIVOT
์ผ๋ก ์ ์ - (2)
PIVOT
์ ์์ญ ์ต์ข๋จ ๊ฐ๊ณผ ์๋ฆฌ ๊ต์ฒด. (pivot์ ๋น๊ต ๋์์ ์ํ์ง ์๋๋ก ํ๊ธฐ ์ํจ.) - (3) PIVOT์ ์ ์ธํ ์ ์์ญ์ ๋ํ์ฌ ์ ๋ ฌ ์งํ (๋ง์ฃผ๋ณด๋ ํฌ ํฌ์ธํฐ ํ์ฉ)
- (3-1)
L
ํฌ์ธํฐ๋ ์ผ์ชฝ์์ ์ถ๋ฐ,R
ํฌ์ธํฐ๋ ์ค๋ฅธ์ชฝ์์ ์ถ๋ฐ - (3-2)
L
ํฌ์ธํฐ๋ pivot๋ณด๋ค ์์ ๊ฐ์ ๋ง๋๋ฉด ๊ณ์ ์ ์ง (ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๋ง๋๋ฉด STOP) - (3-3)
R
ํฌ์ธํฐ๋ ๋ฐ๋๋ก pivot๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋๋ฉด ์ ์ง (๋ฐ๋์ ๊ฒฝ์ฐ STOP) - (3-4)
L
๊ณผR
์ด ๋ ๋ค ๋ฉ์ถฐ์์ ๋, ์๋ฆฌ ๊ต์ฒด (pivot๋ณด๋ค ์์ ๊ฐ์ ์ค๋ฅธ์ชฝ์, ํฐ ๊ฐ์ ์ผ์ชฝ์ ๋ชฐ๊ธฐ ์ํจ.)
- (3-1)
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int [] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
arr = new int [N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
quick_sort(0, N-1);
System.out.println(arr[K-1]);
}
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++;
while (R >= 0 && arr[R] > pivot_value) R--;
if(L <= R) {
swap(L,R);
L++; R--;
}
}
swap(start, R);
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;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
(1) ์ฒ์์ ๊ตฌํํ ์คํจ ์ฝ๋
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
static int [] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
arr = new int [N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
quick_sort(0, N-1);
System.out.println(arr[K-1]);
}
private static void quick_sort (int start, int end) {
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(start >= end) return;
int pivot = start + (end - start)/2;
int pivot_value = arr[pivot];
int L = start; int R = end;
while (L <= R){
while (arr[L] <= pivot_value) L++; // a
while (arr[R] > pivot_value) R--;
if(arr[L] > pivot_value && arr[R] <= pivot_value){ // b
int tmp = arr[L];
arr[L] = arr[R];
arr[R] = tmp;
L++; R--;
}
}
quick_sort(start, R);
quick_sort(L, end);
}
}
์๋์๋ ์ด์ ์ค๋ช !
์ฃผ์ a
๋ถ๋ถ์ ๋ณด๋ฉด, L ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด Pivot_value
์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ ์งํ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ๊ฐ์ด SWAP ๋์ด์ผ ํ๋๋ฐ, ๋์ง ์๊ณ ๋ฌดํ LOOP๋ฅผ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ์๋ฅผ ๋ค์ด [4,1,2,3,5]
๋ผ๋ ์์๋ฅผ ์๊ฐํด๋ณด์.
์ฒซ ์ ๋ ฌ์ ๋ฒ์๊ฐ ์ ์ฒด์ด๊ณ PIVOT์ 2
์ด๋ค. SWAP์ 4์ 2์ ์๋ฆฌ๊ต์ฒด ํ ๋ฒ ์ผ์ด๋๋ค.
๋ ๋ฒ์งธ ์ ๋ ฌ์ ๋ฒ์๊ฐ arr[0] ~ arr[1] ์ด๊ณ PIVOT์ 2
์ด๋ค. ์ด ๊ฒฝ์ฐ์ [2,1]
์ ๋ํด์ ์งํํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ผ๋ ๊ฒ์ ๋์ ์๋ฆฌ๊ต์ฒด์ด๋ค. ํ์ง๋ง ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง๋ฉด, Lํฌ์ธํฐ๊ฐ ์๊พธ 2
๋ฅผ ์ง๋์ณ์ ์ ๋ ฌ์ ๋์ง ์๊ณ , ๋ค์ ์ฌ๊ท์๋ ๊ฐ์ ์์ญ, ๊ฐ์ Pivot์ ๋ํด์ ์งํํ๊ฒ ๋์ด ๋ฌดํ ๋ฃจํ๋ฅผ ๋๊ฒ ๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด PIVOT๊ณผ ๊ฐ์๋ ๋ฉ์ถฐ์ผ ํ๋ค.
์ฃผ์ b
์ ๊ฒฝ์ฐ ์กฐ๊ฑด๋ฌธ ๋ด์ฉ์ด ์ฌ์ค์ ์์ ์ ํ While๋ฌธ ๋ ๊ฐ์ ๊ฐ์์ ์๋ฏธ๊ฐ ์๋ค. ์ง์ง ์ ์์ด์ผ ํ๋ ๋ด์ฉ์ L <= R
์ ๋ง์กฑํ๋ ์ด๋ค. ์ฐ๋ฆฌ๋ L๊ณผ R์ด ์๊ฐ๋ฆฌ๋ฉด ์ฆ์ ๋ฐ๋ณต๋ฌธ์ ์ข
๋ฃํ๊ธธ ๋ฐ๋๋ค. ์๋ํ๋ฉด ๊ทธ๋์ผ์ง ์๋ชป๋ ๊ณ์ฐ์ด ๋์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
L๊ณผ R์ด ์๊ฐ๋ฆฌ๋ฉด, L์ pivot๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ๋ค์ ๋ง๋ ๊ฒ์ด๊ณ , R์ ๋ฌด์กฐ๊ฑด Pivot๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๋ง๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํ์ ์๋ SWAP์ด ์ผ์ด๋ ๊ณ์ฐ์ ๋ง์น๊ฒ ๋๋ค.
(2) ์คํจ ์ฝ๋ ๋ณด์
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
static int [] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
arr = new int [N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
quick_sort(0, N-1);
System.out.println(arr[K-1]);
}
private static void quick_sort (int start, int end) {
// 0. ๊ธฐ์ ์กฐ๊ฑด
if(start >= end) return;
int pivot = start + (end - start)/2;
int pivot_value = arr[pivot];
int L = start; int R = end;
while (L <= R){
while (arr[L] < pivot_value) L++; // ๋ฐ๋ ๋ถ๋ถ - Pivot๊ณผ ๊ฐ์ด ๊ฐ์ผ๋ฉด ์์ง์ด์ง ์๊ธฐ
while (arr[R] > pivot_value) R--;
if(L <= R){ // ๋ฐ๋ ๋ถ๋ถ - ๊ทธ๋ฅ L <=R์ด๋ฉด SWAP
int tmp = arr[L];
arr[L] = arr[R];
arr[R] = tmp;
L++; R--;
}
}
quick_sort(start, R);
quick_sort(L, end);
}
}
(3) ๋ชจ๋ฒ ๋ต์๊ณผ (2)๋ฒ ์ฝ๋์ ํจ์จ์ฑ ๋น๊ต
(2)๋ฒ ์ฝ๋
์ ๊ฒฝ์ฐ์ PIVOT์ ์ ๋ ฌ ๋์์ ๋งค๋ฒ ํฌํจ ์ํค๊ณ ์๋ค. ์ด๋ฌ๋ฉด PIVOT์ ์๋ฆฌ ์ฐพ๊ธฐ๋ฅผ ์ํ ๋ถ ํ์ํ ์ฐ์ฐ์ด ๋งค ์ฐ์ฐ๋ง๋ค ๋ ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ด๋ค. PIVOT์ ์ ๋ ฌ์ ๊ธฐ์ค์ด๊ธฐ์, ์ ๋ ฌ์ด ๋๋๊ณ , ๊ทธ ๋์ ์ ์ ์ฌ์ด์๋ง ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ด๋ฌํ (2)๋ฒ ์ฝ๋์ ๋จ์ ์ ๋ณด์ํ ๊ฒ์ด ์ ๋ต ์ฝ๋
์ด๋ค. ์ด๋ป๊ฒ ๋ณด์ ํ๋์ง ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- PIVOT์ ์ต์ข๋จ์ ๋ฏธ๋ฆฌ ๋นผ๋์ด์ ๊ณ์ฐ์ ์ฐธ์ฌ์ํค์ง ์์
- PIVOT์ ๋ค์ ์ฌ๊ท๊ฐ ์ผ์ด๋๋ ๋ ์ง ๋จ ์ฌ์ด์ ์ฝ์ ํด์, ๋ถ ํ์ํ ์ฐ์ฐ์ด ๋ค์ง ์์.