์์ ์ ๋ ฌ : ๋์ผํ ๊ฐ์ ๊ธฐ์กด ์์๊ฐ ์ ์ง (๋ฒ๋ธ, ์ฝ์ )
๋ถ์์ ์ ๋ ฌ : ๋์ผํ ๊ฐ์ ๊ธฐ์กด ์์๊ฐ ์ ์งX (์ ํ,ํต)
ํต์ํธ๋ ์ต์ ์ ๊ฒฝ์ฐ O(n^2), ํ๊ท ์ ์ผ๋ก ฮ(nlogn)์ ๊ฐ์ง
public void quickSort(int[] array, int left, int right) {
if(left >= right) return;
int pi = partition(array, left, right);
quickSort(array, left, pi-1);
quickSort(array, pi+1, right);
}
ํผ๋ฒ ์ ํ ๋ฐฉ์ : ์ฒซ๋ฒ์งธ, ์ค๊ฐ, ๋ง์ง๋ง, ๋๋ค
(์ ํ ๋ฐฉ์์ ๋ฐ๋ผ ์๋๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ค์ํจ)
public int partition(int[] array, int left, int right) {
int pivot = array[left];
int i = left, j = right;
while(i < j) {
while(pivot < array[j]) {
j--;
}
while(i<j && pivot >= array[i]){
i++;
}
swap(array, i, j);
}
array[left] = array[i];
array[i] = pivot;
return i;
}
- ํผ๋ฒ ์ ํ
- ์ค๋ฅธ์ชฝ(j)์์ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ฒ๋ณด๋ค ์์ ์ ์ฐพ์
- ์ผ์ชฝ(i)์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ฒ๋ณด๋ค ํฐ ์ ์ฐพ์
- ๊ฐ ์ธ๋ฑ์ค i, j์ ๋ํ ์์๋ฅผ ๊ตํ
- 2,3,4๋ฒ ๊ณผ์ ๋ฐ๋ณต
- ๋์ด์ 2,3๋ฒ ์งํ์ด ๋ถ๊ฐ๋ฅํ๋ฉด, ํ์ฌ ํผ๋ฒ๊ณผ ๊ตํ
- ์ด์ ๊ตํ๋ ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ, ์ค๋ฅธ์ชฝ์ ํฐ ๊ฐ๋ค๋ง ์กด์ฌํจ
๋ฒ๋ธ์ ๋ ฌ์ ๋ชจ๋ ๋ฐฐ์ด์ ์์์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ํ๋ํ๋ ์ฆ๊ฐํ๋ฉฐ ๋น๊ตํด๋๊ฐ๋ O(n^2)
ํต์ ๋ ฌ์ ๊ฒฝ์ฐ ์ธ์ ํ ๊ฒ์ด ์๋ ์๋ก ๋จผ ๊ฑฐ๋ฆฌ์ ์๋ ์์๋ฅผ ๊ตํํ๋ฉด์ ์๋๋ฅผ ์ค์ผ ์ ์์
But, ํผ๋ฒ ๊ฐ์ด ์ต์๋ ์ต๋๊ฐ์ผ๋ก ์ง์ ๋์ด ํํฐ์ ์ด ๋๋์ด์ง์ง ์์์ ๋ O(n^2)์ ๋ํ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง
์ด๋ฐ ์ํฉ์์๋ ํต์ํธ ์ฅ์ ์ด ์ฌ๋ผ์ง๋ฏ๋ก, ํผ๋ฒ์ ์ ํํ ๋ ์ค๊ฐ ์์
๋ก ์ ํํ๋ฉด ํด๊ฒฐ์ด ๊ฐ๋ฅํจ
public int partition(int[] array, int left, int right) {
int mid = (left + right) / 2;
swap(array, left, mid);
...
}
์ด๋ ๋ค๋ฅธ O(nlogn) ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ํธ๋ค๋ณด๋ค ๋น ๋ฅด๋ค๊ณ ์๋ ค์ ธ์์
๋จผ๊ฑฐ๋ฆฌ ๊ตํ ์ฒ๋ฆฌ + ์บ์ ํจ์จ(ํ๋ฒ ์ ํ๋ ๊ธฐ์ค์ ์ ์ธ์ํด)
private void solve() {
int[] array = { 80, 70, 60, 50, 40, 30, 20 };
quicksort(array, 0, array.length - 1);
for (int v : array) {
System.out.println(v);
}
}
public static int partition(int[] array, int left, int right) {
int mid = (left + right) / 2;
swap(array, left, mid);
int pivot = array[left];
int i = left, j = right;
while (i < j) {
while (pivot < array[j]) {
j--;
}
while (i < j && pivot >= array[i]) {
i++;
}
swap(array, i, j);
}
array[left] = array[i];
array[i] = pivot;
return i;
}
public static void swap(int[] array, int a, int b) {
int temp = array[b];
array[b] = array[a];
array[a] = temp;
}
public static void quicksort(int[] array, int left, int right) {
if (left >= right) {
return;
}
int pi = partition(array, left, right);
quicksort(array, left, pi - 1);
quicksort(array, pi + 1, right);
}