반응형
퀵 정렬 (Quick Sort)
퀵 정렬은 분할 정복(Divide and Conquer) 기법을 사용하는 효율적인 정렬 알고리즘입니다. 배열을 피벗(Pivot)을 기준으로 두 개의 하위 배열로 나눈 다음, 각각을 정렬합니다. 퀵 정렬은 평균적으로 매우 빠른 정렬 알고리즘으로 간주됩니다.
퀵 정렬의 시간 복잡도:
- 평균의 경우: (O(n \log n))
- 최악의 경우: (O(n^2))
- 최선의 경우: (O(n \log n))
퀵 정렬의 공간 복잡도:
- (O(\log n)) (재귀 호출 스택 공간)
퀵 정렬 구현
퀵 정렬의 주요 단계:
- 분할 (Partition): 피벗을 기준으로 배열을 두 부분으로 나눕니다.
- 정복 (Conquer): 하위 배열을 재귀적으로 정렬합니다.
- 결합 (Combine): 분할된 하위 배열이 정렬된 상태이므로 추가적인 결합 단계는 필요 없습니다.
퀵 정렬의 구현 코드
#include <iostream>
#include <vector>
// 분할 함수
int partition(std::vector<int>& arr, int low, int high) {
int pivot = arr[high]; // 피벗을 배열의 마지막 요소로 설정
int i = low - 1;
for (int j = low; j <= high - 1; ++j) {
if (arr[j] <= pivot) {
++i;
std::swap(arr[i], arr[j]); // 피벗보다 작거나 같은 요소는 왼쪽으로 이동
}
}
std::swap(arr[i + 1], arr[high]); // 피벗을 올바른 위치에 놓음
return i + 1;
}
// 퀵 정렬 함수
void quickSort(std::vector<int>& arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high); // 분할 후 피벗의 위치
quickSort(arr, low, pi - 1); // 왼쪽 하위 배열 정렬
quickSort(arr, pi + 1, high); // 오른쪽 하위 배열 정렬
}
}
int main() {
std::vector<int> arr = {10, 7, 8, 9, 1, 5};
std::cout << "정렬 전 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
quickSort(arr, 0, arr.size() - 1);
std::cout << "정렬 후 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
설명
- 분할 함수 (Partition Function):
- 피벗을 기준으로 배열을 두 부분으로 나눕니다.
- 피벗보다 작거나 같은 요소는 왼쪽으로, 피벗보다 큰 요소는 오른쪽으로 이동시킵니다.
- 피벗을 올바른 위치에 놓고 그 위치의 인덱스를 반환합니다.
- 퀵 정렬 함수 (Quick Sort Function):
- 분할 함수로 배열을 분할한 후, 재귀적으로 왼쪽 하위 배열과 오른쪽 하위 배열을 정렬합니다.
퀵 정렬의 기본 개념과 구현 방법을 이해했습니다. 다음 단계로 넘어가며, 더 복잡한 정렬 알고리즘과 다양한 알고리즘을 학습해보겠습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 20: 힙 정렬"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++로 배우는 알고리즘과 자료구조 시리즈' 카테고리의 다른 글
[C++로 배우는 알고리즘과 자료구조] Day 21: 기수 정렬과 계수 정렬 (0) | 2024.08.01 |
---|---|
[C++로 배우는 알고리즘과 자료구조] Day 18: 합병 정렬 (Merge Sort) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 16: 버블 정렬과 선택 정렬 (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 17: 삽입 정렬과 쉘 정렬 (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조 ] Day 14: 해시 함수와 충돌 해결 기법 (0) | 2024.08.01 |