public interface QuickSortInterface {
public void swap(int[] arr, int start, int end);
public int partition(int[] arr, int start, int end);
public void QuickSort(int[] arr);
public void QuickSort(int[] arr, int start, int end);
}
인터페이스에서 미리 메소드를 정의해 두었다.
이런식으로 구성한 후 클래스에서 인터페이스 상속을 통해 오버라이딩 메서드를 구현하는게 깔끔한듯하다.
@Override
public void swap(int[] arr, int start, int end) {
int tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
}
@Override
public int partition(int[] arr, int start, int end) {
int pivot = arr[(start+end)/2];
//틀렸던 부분 int pivot = (arr[start] + arr[end]) / 2
while(start<= end) {
while(arr[start]<pivot) start++;
while(arr[end] > pivot) end--;
//틀렸던 부분 (start<pivot), (end > pivot)
if(start<=end) {
swap(arr,start,end);
start++;
end--;
}
}
return start;
}
@Override
public void QuickSort(int[] arr) {
QuickSort(arr, 0, arr.length-1);
}
@Override
public void QuickSort(int[] arr, int start, int end) {
int part2 = partition(arr, start, end);
if(start < part2 - 1) {
QuickSort(arr,start, part2-1);
}
if(part2 < end) {
QuickSort(arr, part2, end);
}
}
//출력용 메서드
private static void printArray(int[] arr) {
for (int data : arr) {
System.out.print(data+", ");
}
}
pivot과 partition메서드가 이 퀵정렬 로직의 핵심이다.
QuickSort메서드 부분에서는 재귀적인 로직이 들어가는데 쉽지않은 부분인듯하다.
도대체 어디서 어떻게 흘러가는지 감 못잡으면 재귀적인 로직은 구상하기가 힘들듯..
일단은 조건문부분을 정확히 이해하는게 재귀로직을 세우는 핵심이라고 본다.