๋ณดํต ์๋ฐ์ Arrays.sort(arr)์ Dual-Pivot QuickSort์ ์ด๋ค๊ณ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด QuickSort๋ ๋ฌด์์ผ๊น? ํ๋ฒ ์์๋ณด๋๋ก ํ์.
ํต ์ ๋ ฌ์ด๋ ํน์ ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ํผ๋ฒ๋ณด๋ค ์์๊ฐ ์ค๋ฅธ์ชฝ์ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ ๋ ฌํด๋๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.

ํผ๋ฒ์ ์ค์๊ฐ์ธ 5๋ก ์ก์์ ๋, ์์ ์ฌ์ง์ฒ๋ผ start์ end๋ฅผ ์ ๋๋จ์ผ๋ก ์ก๋๋ค.

๊ทธ๋ฆฌ๊ณ start๋ฅผ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ด๋ฉด ๊ณ์ ++๋ฅผ ์์ผ์ค๋ค. ๋ง์ฝ ํผ๋ฒ๋ณด๋ค ํฐ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด์ด ๋์จ๋ค๋ฉด ๋ฉ์ถ๋ค.
while(start<pivot) -> start++์ด๋ฐ์์ผ๋ก ๊ตฌํ
๋ํ end๋ฅผ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ด๋ฉด ๊ณ์ --๋ฅผ ์์ผ์ฃผ๊ณ ๋ง์ฝ ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด ๋์จ๋ค๋ฉด ๋ฉ์ถ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ์ฌ์ง์ฒ๋ผ ์๋ก ์ค์ํ๋ค.

๊ทธ๋ฆฌ๊ณ s์ e๊ฐ ๊ฐ์์ง๋ฉด ํ ์ฌ์ดํด์ด ์ข ๋ฃ๋ ๊ฒ์ด๋ค.
์ฒซ๋ฒ์งธ ์ฌ์ดํด์ด ๋๋ฉด ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์์ชฝ ๊ตฌ๊ฐ์์ ๋ ๊ฐ์์ ํผ๋ฒ์ ์ ํ๊ณ ํ๋ฒ ๋ ์คํ๋๋ค. ๋ง์ฝ ์ผ์ชฝ ๊ตฌ์ญ์ด ํ๋๊ฐ ๋จ๊ฑฐ๋ ์ค๋ฅธ์ชฝ ๊ตฌ์ญ์ด ํ๋๊ฐ ๋จ์์ ์, ํด๋น ๋ถ๋ถ์ ํต์ํธ๋ฅผ ๋ ์ด์ ํ์ง ์๋๋ค. ์๋์ ๊ฐ์ ์ํญ์ด ๊ทธ ์์์ด๋ค.

๋ง์ฝ ์ด๋ ๊ฒ ๊ณ์ ํต์ ๋ ฌ๋ฅผ ํ๋ค๋ณด๋ฉด ์๋์ ๊ฐ์ ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ค.

๋งจ ์ฒ์ ์ฌ์ง์ธ ๊ฒฝ์ฐ๋ QuickSort(0,0)์ผ ๊ฒ์ด๊ณ ํด๋น ์คํ ์กฐ๊ฑด์ start<pivot-1 ์ด๋ฐ์์ผ๋ก ๋ ๊ฒ์ด๋ค.
์์ ๊ฐ์ ํธ๋ฆฌ์ ํํ๋ก ๋ณด์์ ๋, ์๊ฐ ๋ณต์ก๋๋ nlogn์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฐ. Partition์์ Swap
1) pivot์ ๋ฐฐ์ด์ ์ค์ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
2) start์ end๋ฅผ 0 ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ํ ๋นํ๋ค.
3) arr[start]๊ฐ ํผ๋ฒ๋ณด๋ค ์์ผ๋ฉด start++
4) arr[end]๊ฐ ํผ๋ฒ๋ณด๋ค ํฌ๋ฉด end--
6) start์ end๊ฐ stop๋๊ณ , start<=end๋ผ๋ฉด arr[start]์ arr[end]๋ฅผ swapํ๋ค.
7) ์ ๊ณผ์ ์ start<=end๋์ ๋ฐ๋ณตํ๋ค.
8) start๋ฅผ Returnํ๋ค.
โ : ์ Start๋ฅผ Returnํ ๊น?
ํํฐ์ ์์์ ์ค์์ด ์ด๋ฃจ์ด์ง๊ณ , ๊ฒฐ๊ตญ 2๊ฐ๋ก ๋๋ ์ง ์ฒซ๋ฒ์งธ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ start๊ฐ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ด๋ค.
๋. ์ ์ฒด์ ์ธ ํ๋ฆ
1) ํํฐ์
์งํ
2) ํํฐ์
ํ ์ผ์ชฝ๋ฐฐ์ด์ ์์๊ฐ 2๊ฐ ์ด์์ด๋ฉด ๋ค์ ํต์ํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํด์ ํํฐ์
์ ์งํํ๋ค.
3) ์ค๋ฅธ์ชฝ๋ 3๋ฒ๊ณผ ๋์ผ
๐ก ๊ทธ๋ ๋ค ์ฌ๊ท = ํธ๋ฆฌ์ด๋ฏ๋ก ํธ๋ฆฌํํ๋ก ํต์ํธ๊ฐ ์งํ๋๋ค.
import java.util.Arrays;
public class P19 {
static void quickSort(int[] arr){
quickSort(arr, 0, arr.length-1);
}
static void quickSort(int[] arr, int start, int end) {
int part2 = partition(arr,start,end); // part2 : ๋๋ฒ์งธ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ idx
if(start+1<part2){
partition(arr,start,part2-1);
}
if(part2<end){
partition(arr,part2,end);
}
}
static int partition(int[] arr, int start, int end){
int pivot = arr[(arr[start]+arr[end])/2];
while(start<=end){
while(arr[start]<pivot) start++;
while(arr[end]>pivot) end--;
if(start<=end){
swap(arr, start, end);
start++;
end--;
}
}
return start;
}
static void swap(int[] arr, int start, int end){
int tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
}
public static void main(String[] args) {
int[] arr = new int[]{2,3,4,1};
quickSort(arr);
System.out.println(Arrays.toString(arr));
}
}