원리 다이어그램
초기 배열: [5, 3, 8, 4, 2]
피벗 선택: 2 (혹은 마지막 원소 등 선택 기준에 따라 달라짐)
1. 분할 과정:
[5, 3, 8, 4, 2]
| ← 피벗 2 기준
작은 값들: [] // 2보다 작은 값 (없음)
큰 값들: [5, 3, 8, 4] // 2보다 큰 값
2. 재귀적으로 정렬:
배열이 분할되어, 각 부분에 대해 동일한 과정을 반복
예: [5, 3, 8, 4] 에서 피벗 선택 후 재분할
초기 배열: [5, 3, 8, 4, 2]
pivot: 2 (arr[high])
i: -1 시작
for 루프:
j=0: arr[0]=5 > pivot, skip
j=1: arr[1]=3 > pivot, skip
j=2: arr[2]=8 > pivot, skip
j=3: arr[3]=4 > pivot, skip
끝난 후: i = -1
피벗 swap: arr[0] <-> arr[4] → [2, 3, 8, 4, 5]
return 0 (pivot 위치)
참고: 실제 구현에서는 피벗 선택 방식이 다양하며, 위 다이어그램은 기본 개념 이해를 위한 단순화된 예입니다.
자바코드 예시
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[high]; // 마지막 원소를 피벗으로 선택
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
// arr[i]와 arr[j] 교환
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 피벗을 올바른 위치로 이동
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
public static void main(String[] args) {
int[] data = {5, 3, 8, 4, 2};
quickSort(data, 0, data.length - 1);
for (int num : data) {
System.out.print(num + " ");
}
}
}
Share article