# ํต ์ ๋ ฌ (Quick Sort)
written by sohyeon, hyemin ๐ก
# 1. ํต ์ ๋ ฌ์ด๋?
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ ์์ฃผ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ ๋ ฌ ์๋๊ฐ ๋น ๋ฅธ ๋ฐ์ ์ฐฉ์ํด ํต
์ ๋ ฌ ์ด๋ผ๋ ์ด๋ฆ์ด ๋ถ์ฌ์ก๋ค.
๋ค๋ฅธ ์์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
# 2. ๋์ ๋ฐฉ์
๋์์ ์ํํ ๋ ๊ฐ ๊ทธ๋ฃน์ ๋ํด pivot
์ค์ ๊ณผ ๊ทธ๋ฃน ๋๋์ ๋ฐ๋ณตํ๊ฒ ๋๋ฉฐ
๋ชจ๋ ๊ทธ๋ฃน์ด 1๋ช
์ด ๋๋ฉด ์ ๋ ฌ์ ๋ง์น๊ฒ ๋๋ค.
์ด ๊ณผ์ ์ ๋ถํ ์ ๋ณต (Divide and Conquer)์ด๋ผ๊ณ ํ๋ค.
# 1) Divide and Conquer
Divide (PARTITION๊ณผ์ )
์ ๋ ฌ ํด์ผ ํ ๋ฆฌ์คํธ ์์ ์๋ ํ ์์๋ฅผ ์ ํํด pivot์ผ๋ก ์ง์ ,
pivot์ ๊ธฐ์ค์ผ๋ก ์์ ์์๋ค์ ์ผ์ชฝ, ํฐ ์์๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋Conquer
pivot์ ์ ์ธํ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ์ ๋ ฌ
๋ถํ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ์ ๋ํด ๋ค์ pivot์ ์ง์ ํ๊ณ
2๊ฐ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ๋๋๋ ๊ณผ์ ๋ฐ๋ณตPivot ์ค์
# 2) ๋์ ๊ณผ์
- ์์์ ํ ์์๋ฅผ pivot์ผ๋ก ์ ํ
- Pivot์ ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
- Pivot์ ์ ์ธํ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ partition๊ณผ์ ๋ฐ๋ณต
- ์์ ๊ณผ์ ์ ๋ฐ๋ณตํด ๊ฐ๊ฐ ๋ถํ ๋ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ๋๋ฉด ์ ๋ ฌ์ด ๋๋จ
# 3. ํน์ง
# 1) ์ฅ์
- ํ๊ท ์ ์ผ๋ก ๋น ๋ฅธ ์ํ ์๋๋ฅผ ๊ฐ์ง
# 2) ๋จ์
- Unstableํ ์ ๋ ฌ์
# 4. ์๊ฐ ๋ณต์ก๋
์ ๋ ฅ๋๋ ์๋ฃ์ ๋ฐ๋ผ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
# 1) Worst Case
์์ ํ๊ฒ ํ์ชฝ์ผ๋ก ๋ชฐ๋ ค ๊ทธ๋ฃน์ด ๋๋๋ ๊ฒฝ์ฐ,
left๊ฐ n-1๊ฐ์ ์์๋ฅผ ๊ฐ๊ณ right๊ฐ 0๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๋
T(n)=1+2+โฏ+n-1+n=n(n-1)/2
โดT(n)=O(n^2)
# 2) Best Case
pivot๊ฐ์ด ๊ณ์ ์ค์์ ์์ฑํด left, right๊ฐ ๊ท ๋ฑํ๊ฒ ๋๋ ๋
T(n) = 2T(n/2)+O(n) ( O(n)์ Divide๊ณผ์ )
โดT(n)=O(nlog_2โกn)
# 3) Average Case
best case์ ๋ณดํต ๊ฐ๊น์
์ผ์ ํ ๋น์จ๋ก ๋ถํ ๋๋ค๋ฉด O(nlog_2โกn )์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง
๊ทน๋จ์ ์ด๊ฒ ๋ถํ ๋๋ ๋น์จ์ด ์น์ฐ์น ๊ฒฝ์ฐ์๋ ๋์ผํจ
์๋ ์ฆ๋ช ์ ์ํด log_2n์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ T(n)์ ์๋์ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
# 4. ์์ ์ฝ๋
import java.util.Scanner;
// ํต ์ ๋ ฌ
class QuickSort {
// ๋ฐฐ์ด ์์ a[idx1]๊ณผ a[idx2]์ ๊ฐ์ ๋ฐ๊ฟ๋๋ค.
static void swap(int[] a, int idx1, int idx2) {
int t = a[idx1]; a[idx1] = a[idx2]; a[idx2] = t;
}
// ํต ์ ๋ ฌ
static void quickSort(int[] a, int left, int right) {
int pl = left; // ์ผ์ชฝ ์ปค์
int pr = right; // ์ค๋ฅธ์ชฝ ์ปค์
int x = a[(pl + pr) / 2]; // ํผ๋ฒ
do {
while (a[pl] < x) pl++;
while (a[pr] > x) pr--;
if (pl <= pr)
swap(a, pl++, pr--);
} while (pl <= pr);
if (left < pr) quickSort(a, left, pr);
if (pl < right) quickSort(a, pl, right);
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("ํต ์ ๋ ฌ");
System.out.print("์์์๏ผ");
int nx = stdIn.nextInt();
int[] x = new int[nx];
for (int i = 0; i < nx; i++) {
System.out.print("x[" + i + "]๏ผ");
x[i] = stdIn.nextInt();
}
quickSort(x, 0, nx - 1); // ๋ฐฐ์ด x๋ฅผ ํต ์ ๋ ฌ
System.out.println("์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ต๋๋ค.");
for (int i = 0; i < nx; i++)
System.out.println("x[" + i + "]๏ผ" + x[i]);
}
}