# define MAX_SIZE 9
# define SWAP(x, y, temp) ( (temp)=(x), (x)=(y), (y)=(temp) )
/* pivot을 기준으로 2개의 부분 리스트로 나누고
pivot보다 작은 값은 왼쪽, 큰 값은 오른쪽 부분 리스트로 옮긴다.*/
int partition(int list[], int left, int right) {
int pivot, temp;
int low, high;
low = left;
high = right + 1;
pivot = list[left]; // 임의의 값을 피벗으로 선택
/* low와 high가 교차할 때까지 반복(low < high) */
do {
// list[low]가 피벗보다 작으면 계속 low를 증가 //
do {
// left+1 에서 low 시작
low++;
} while (low <= right && list[low] < pivot);
/* list[high]가 피벗보다 크면 계속 high를 감소 */
do {
high--;
} while (high >= left && list[high] > pivot);
// 만약 low와 high가 교차하지 않았으면 list[low]를 list[high] 교환
if (low < high) {
SWAP(list[low], list[high], temp);
}
} while (low < high);
/* low와 high가 교차했으면 반복문을 나와서
list[left]와 list[high]를 교환 후 pivot 반환 */
SWAP(list[left], list[high], temp);
return high;
}
void quick_sort(int list[], int left, int right) {
// 리스트의 크기가 0이나 1이 아니면 //
if (left < right) {
// pivot을 기준으로 비균등 분할
int q = partition(list, left, right);
// 피벗은 제외한 2개의 부분 리스트를 대상으로 순환 호출
quick_sort(list, left, q - 1); // 앞쪽 부분 리스트 정렬
quick_sort(list, q + 1, right); // 뒤쪽 부분 리스트 정렬
}
}