staticconstint number = 10; int data[10] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };
voidquickSort(int* data, int pos_start, int pos_end) { if (pos_start >= pos_end) { // 정렬 하고자 하는 집단의 원소가 1개인 경우 return; }
int key = pos_start; // 키는 첫번째 원소 int i = pos_start + 1; int j = pos_end; int temp;
while (i <= j) { // 엇갈릴 때까지 반복 while (data[i] <= data[key]) { // 키 값보다 큰 값을 만날 때까지 오른쪽으로 이동 i++; } while (data[j] >= data[key] && j > pos_start) { // 키 값보다 작은 값을 만날 때까지 왼쪽으로 이동 j--; } if (i > j) { // 현재 엇갈린 상태면 키 값과 교체 temp = data[j]; data[j] = data[key]; data[key] = temp; } else { temp = data[j]; data[j] = data[i]; data[i] = temp; } } quickSort(data, pos_start, j - 1); quickSort(data, j + 1, pos_end); }
intmain(void) { quickSort(data, 0, number - 1);
for (int i = 0; i < number; i++) { printf("%d ", data[i]); } return0; }
개요
퀵 정렬은 특정한 값을 기준으로 해당 값보다 큰 숫자와 작은 숫자를 서로 교환하면서 정렬을 수행합니다. 퀵 정렬은 대표적인 분할 정복 알고리즘으로 평균적으로 선택 정렬, 버블 정렬, 삽입 정렬보다 월등히 빠르다는 특징을 가지고 있습니다.
위 세가지 정렬이 O(N2)인것에 비해 퀵 정렬은 O(N*logN)의 속도를 가지고 있기 때문입니다.
비교의 기준이 되는 특정한 값을 피봇(Pivot)이라고 부르며 보통 가장 앞에 있는 숫자를 Pivot으로 사용합니다.
작동 원리
배열을 왼쪽에서 오른쪽으로 순회하면서 Pivot 보다 큰 수를 찾습니다.
배열을 오른쪽에서 왼쪽으로 순회하면서 Pivot보다 작은 수를 찾습니다.
1의 결과와 2의 결과를 서로 Swap합니다.
단, 2의 결과가 1의 결과보다 더 왼쪽에 있을 경우 Pivot과 2의 결과(작은 수)를 서로 Swap합니다. 이때, Pivot의 왼쪽은 Pivot보다 작고, 오른쪽은 Pivot보다 큽니다.
시간 복잡도
퀵 정렬은 O(N*logN)의 시간 복잡도를 가집니다. 이게 O(N2)보다 얼마나 빠른지 감이 잘 안잡히시죠?
staticconstint number = 10; int data[10] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };
voidquickSort(int* data, int pos_start, int pos_end) { if (pos_start >= pos_end) { // 정렬 하고자 하는 집단의 원소가 1개인 경우 return; }
int key = pos_start; // 키는 첫번째 원소 int i = pos_start + 1; int j = pos_end; int temp;
while (i <= j) { // 엇갈릴 때까지 반복 while (data[i] >= data[key]) { // 키 값보다 작은 값을 만날 때까지 오른쪽으로 이동 i++; } while (data[j] <= data[key] && j > pos_start) { // 키 값보다 큰 값을 만날 때까지 왼쪽으로 이동 j--; } if (i > j) { // 현재 엇갈린 상태면 키 값과 교체 temp = data[j]; data[j] = data[key]; data[key] = temp; } else { temp = data[j]; data[j] = data[i]; data[i] = temp; } } quickSort(data, pos_start, j - 1); quickSort(data, j + 1, pos_end); }
intmain(void) { quickSort(data, 0, number - 1);
for (int i = 0; i < number; i++) { printf("%d ", data[i]); } return0; }