퀵정렬은 기준값을 선정하여 큰 데이터와 작은 데이터를 분류하는 것을 반복하여 정렬하는 알고리즘입니다.
기준값을 선정하는 것이 핵심이며, 이에 따라 시간 복잡도에 많은 영향을 미칩니다.
평균적인 시간 복잡도 : O(nlogn) - 병합정렬
핵심 이론은 기준값을 중심으로 데이터를 2개의 집합으로 나누면서 정렬하는 것이 퀵 정렬의 핵심입니다.
퀵 정렬 과정 은 다음과 같습니다.
즉, 퀵정렬의 큰 특징은 '피벗'을 하나 설정하고 피벗보다 작은 값들은 왼쪽에, 큰 값들은 오른쪽에 치중하도록 하는 것이며, 이 과정을 파티셔닝(Partitioning) 이라고 한다.
public class 퀵정렬 {
static int[] arr;
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N];
for(int i=0; i < N; i++){
arr[i] = (int)(Math.random()*N);//0~9
}
System.out.println("정렬 전 : " + Arrays.toString(arr));
quick_sort(arr, 0, N-1);
System.out.println("정렬 후 : " + Arrays.toString(arr));
}
static void quick_sort(int[] arr, int low, int high){
if(low >= high)
return;
int pivot = partition(arr,low, high);
quick_sort(arr, low, pivot);
quick_sort(arr, pivot+1, high);
}
static int partition(int[] arr, int left, int right){
int low = left-1; // -1
int high = right+1; // N
int pivot = arr[(left+right)/2]; // 중간 pivot
while(true){
while(arr[++low] < pivot);
while(arr[--high] > pivot && high >= low);
if(low >= high)
return high;
swap(arr,low,high);
}
}
static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}