์์ฐ๋ฉด ์ ๋ง ํจ์จ์ ์ธ ํต ์ํธ
ํต์ํธ์ ์๊ฐ ๋ณต์ก๋๋ O(nlogn)์ด๋ค.
๋ํ ํต ์ํธ์ ๋ํด ์ ๋๋ก ์ดํด๋ง ํ๋ค๋ฉด, ๋์ฑ๋ ๋น ๋ฅด๊ฒ ๋ต์ ๊ตฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
ํต ์ํธ์ ์ ๋ฐ์ ์ธ ๊ณผ์ ์ ๋ํด ์ดํดํด๋ณด์.
1. ํผ๋ฒ์ ํ๋ ์ ํํ๋ค.
์ด ๋, ํผ๋ฒ์ ๋ถ๋ถ ๋ฐฐ์ด์ ๊ฐ์ฅ ์ผ์ชฝ์ ์ ํํ๋, ์ค๊ฐ์ ์ ํํ๋, ์ ์ผ ์ค๋ฅธ์ชฝ์ ์ ํํ๋์ ๋ฐ๋ผ์ ํจ์จ์ด ๋ค๋ฅผ ์ ์๋ค.
2. ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์์ชฝ์์ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ๊ณผ ์์ ๊ฐ์ ์ฐพ๋๋ค.
ํท๊ฐ๋ฆฐ๋ค๋ฉด, ์ ๋ ฌ์ด๋ผ๊ณ ์๊ฐํด๋ณด์. ์ผ์ชฝ์๋ ์์ ๊ฐ๋ค๋ถํฐ ์ค๋ฅธ์ชฝ์๋ ํฐ ๊ฐ๊น์ง ์์ด์ผ ํ๋ค.
๊ทธ๋ด๋ ค๋ฉด, ์ผ์ชฝ์์๋ถํฐ๋ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ์์๋ถํฐ๋ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ์ฐพ์ ๋ฐ๊พธ์ด ์ค ํ์๊ฐ ์๋ค.
3. ์์ชฝ์์ ์ฐพ์ ๊ฐ์ ์๋ก ๋ฐ๊พธ์ด ์ค๋ค.
4. ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์์ ํ์ํ๋ ์์น๊ฐ ์๋ก ์๊ฐ๋ฆฌ์ง ์์ ๋(์ฆ, ๊ฐ์ ๊ฒฝ์ฐ๋ ํฌํจ)๊น์ง 2์ ๊ณผ์ ์ ๊ณ์ํด์ ๋ฐ๋ณตํด์ค๋ค.
5. ์๊ฐ๋ฆฐ ๊ธฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋์ด, ๊ธธ์ด๊ฐ 1์ด ์๋ ๋๊น์ง 1์ ๊ณผ์ ๋ถํฐ ๋ฐ๋ณตํด์ค๋ค.
6. ์ธ์ ํ ๋ถ๋ถ๋ฆฌ์คํธ๋ผ๋ฆฌ ํฉ์น๋ค.
๋ง์ฝ ์ด ๊ณผ์ ์ ์ดํดํ ์ ์๋ค๋ฉด, ์ฝ๊ฒ ํต์ํธ๋ฅผ ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ค.

ํต ์ํธ์ ๊ธฐ๋ณธ์ ์ธ ๋ชจ์
์ผ๋ฐ์ ์ผ๋ก ํต์ํธ๋ฅผ ์ฌ์ฉํ ๋, ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
public class QuickSorter {
public static void quickSort(int[] arr) {
sort(arr, 0, arr.length - 1);
}
private static void sort(int[] arr, int low, int high) {
if (low >= high) return;
int mid = partition(arr, low, high);
sort(arr, low, mid - 1);
sort(arr, mid, high);
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[(low + high) / 2];
while (low <= high) {
while (arr[low] < pivot) low++;
while (arr[high] > pivot) high--;
if (low <= high) {
swap(arr, low, high);
low++;
high--;
}
}
return low;
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
์ ์ผ ๊ธฐ๋ณธ์ ์ธ ๋ชจ์์ด๋ฉฐ, ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ๋ค์ ์ผ์ชฝ, ํฐ ๊ฐ๋ค์ ์ค๋ฅธ์ชฝ์ ์น์คํ๋ ํํฐ์ ๋ ๊ณผ์ ์ด ํฌํจ๋์ด ์๋ค.
ํต ์ํธ์ ์์ฉ
์์ ๋ฌธ์ ๋ก ๋ฐฑ์ค 11004๋ฒ ๋ฌธ์ ๋ฅผ ์ฐธ๊ณ ํด๋ณด์.
11004๋ฒ: K๋ฒ์งธ ์
์ N๊ฐ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ ๋, ์์์๋ถํฐ K๋ฒ์งธ ์๋ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[] A = new int[n];
st = new StringTokenizer(bf.readLine());
for(int i=0; i<n; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
quick_sort(A, 0, n-1, k-1);
System.out.println(A[k-1]);
}
public static void quick_sort(int[] A, int S, int E, int K) {
if(S < E) {
int pivot = partition(A, S, E);
if (pivot == K) {
return;
} else if (K < pivot) {
quick_sort(A, S ,pivot-1, K);
} else {
quick_sort(A, pivot+1, E, K);
}
}
}
public static int partition(int[] A, int S, int E) {
if (S + 1 == E) {
if(A[S] > A[E]) swap(A, S, E);
return E;
}
int M = (S+E) / 2;
swap(A, S, M);
int pivot = A[S];
int i = S+1, j = E;
while(i <= j) {
while(pivot < A[j] && j > 0) {
j--;
}
while(pivot > A[i] && i < A.length -1) {
i++;
}
if (i <= j) {
swap(A, i++, j--);
}
}
A[S] = A[j];
A[j] = pivot;
return j;
}
public static void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
ํด๋น ๋ฌธ์ ๋ k๋ฒ์งธ ๊ฐ์ ์ฐพ๊ธฐ ์ํด์ ํํฐ์ ๋ ๊ณผ์ ์์ ๋ฐํ๋๋ ํผ๋ฒ ๊ฐ์ ๊ฒ์ฌํ๋ค.
์ด ๊ณผ์ ์ ํตํด k๋ฒ์งธ ๊ฐ์ ์ฐพ์ผ๋ฉด, ๊ทธ ์ฆ์ ํ๋ก๊ทธ๋จ์ ์ค์ง์์ผ ๋นํจ์จ์ ์ธ ์ฐ์ฐ์ ๋ฐฉ์งํ๋ค.
๋ํ ๋๊ฐ์ด ์ค๊ฐ ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ฌ์ฉํ๋, ์ฐ์ฐ์ ํธ๋ฆฌ์ฑ์ ์ํด์ ์ ์ผ ์ฒ์์ pivot์ ๋งจ ์์ผ๋ก ์ด๋์ํจ๋ค.
์ดํ, ๋ ์งํฉ์ ๋๋์ด ์ฃผ๋ ์์น์ pivot์ swapํ ์ ์๋ค.(์ฌ์ค pivot ์์น๋ฅผ ์ค๊ฐ์ผ๋ก ํ๋ค๋ฉด ์ด ๊ณผ์ ์ด ํ์ ์๊ธดํ๋ค. ๋ ํจ์จ์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.)
A[S] = A[j];
A[j] = pivot
์ฌ๊ธฐ์ A[S]๋ ์ฝ๋ ์์์ pivot ๊ฐ๊ณผ ๊ฐ๋ค๊ณ ์ ์ธํด์ฃผ์๊ธฐ์ ์ฌ์ค ์ ๊ฐ๋ค.
ํํฐ์ ๋ ๊ฒฐ๊ณผ๋ก ๋ฐํ๋๊ณ , ๋ ์งํฉ์ ๋๋์ด์ฃผ๋ ์์น๋ฅผ ๋ฐํํด์ฃผ๋ ํผ๋ฒ ๊ฐ์ ์์น๋ ๊ณ ์ ์ ์ด๋ค.
์ด๋ ์ด ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ, ์ผ๋ฐ์ ์ธ ํต ์ํธ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฌํ๋ค.
์ฆ, ์ด ์์น ์์ฒด๊ฐ ๋ช ๋ฒ์งธ ์์น์ธ์ง๋ฅผ ๋ํ๋ด์ค๋ค๋ ๊ฒ์ด๋ค.
์ด ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ด์ ์ ๋ต์ ๋์ถํ ์ ์๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ์ด ํธ
์๋ฐ [JAVA] - ํต ์ ๋ ฌ (Quick Sort)
[์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ชจ์] ๋๋ณด๊ธฐ 1. ๊ณ์ ์ ๋ ฌ (Counting Sort) 2. ์ ํ ์ ๋ ฌ (Selection Sort) 3. ์ฝ์ ์ ๋ ฌ (Insertion Sort) 4. ๊ฑฐํ ์ ๋ ฌ (Bubble Sort) 5. ์ ธ ์ ๋ ฌ (Shell Sort) 6. ํ ์ ๋ ฌ (Heap Sort) 7. ํฉ๋ณ(๋ณํฉ) ์ ๋ ฌ (Merge
st-lab.tistory.com
[์๊ณ ๋ฆฌ์ฆ] ํต ์ ๋ ฌ - Quick Sort (Python, Java)
Engineering Blog by Dale Seo
www.daleseo.com
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๊ณ ๋ฆฌ์ฆ] DFS์ BFS ๋ค๋ฃจ๊ธฐ (0) | 2023.08.25 |
|---|---|
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ณํฉ, ๊ธฐ์) ์๊ณ ๋ฆฌ์ฆ (3) (0) | 2023.08.18 |
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ฒ๋ธ, ์ ํ, ์ฝ์ ) ์๊ณ ๋ฆฌ์ฆ (1) (0) | 2023.08.13 |
| [์๊ณ ๋ฆฌ์ฆ] ์คํ๊ณผ ํ์ ์ฌ์ฉ (0) | 2023.08.12 |
| [์๊ณ ๋ฆฌ์ฆ] ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.08.11 |