반응형
기수 정렬 (Radix Sort)
기수 정렬은 각 자릿수를 기준으로 정렬하는 비교 기반이 아닌 정렬 알고리즘입니다. 기수 정렬은 주로 정수나 문자열을 정렬하는 데 사용되며, 각 자릿수에 대해 계수 정렬을 사용하여 정렬을 수행합니다.
기수 정렬의 시간 복잡도:
- (O(d \times (n + k))), 여기서 (d)는 자릿수의 개수, (n)은 요소의 개수, (k)는 기수(base)입니다.
기수 정렬 구현
#include <iostream>
#include <vector>
#include <algorithm>
// 계수 정렬 함수
void countingSort(std::vector<int>& arr, int exp) {
int n = arr.size();
std::vector<int> output(n); // 정렬된 결과를 저장할 배열
int count[10] = {0};
// 각 자릿수의 개수 세기
for (int i = 0; i < n; ++i) {
count[(arr[i] / exp) % 10]++;
}
// count[i]가 실제 위치를 가리키도록 조정
for (int i = 1; i < 10; ++i) {
count[i] += count[i - 1];
}
// 출력 배열에 정렬된 값 저장
for (int i = n - 1; i >= 0; --i) {
output[count[(arr[i] / exp) % 10] - 1] = arr[i];
count[(arr[i] / exp) % 10]--;
}
// 결과를 원래 배열에 복사
for (int i = 0; i < n; ++i) {
arr[i] = output[i];
}
}
// 기수 정렬 함수
void radixSort(std::vector<int>& arr) {
int maxVal = *std::max_element(arr.begin(), arr.end());
// 자릿수별로 계수 정렬 수행
for (int exp = 1; maxVal / exp > 0; exp *= 10) {
countingSort(arr, exp);
}
}
int main() {
std::vector<int> arr = {170, 45, 75, 90, 802, 24, 2, 66};
std::cout << "정렬 전 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
radixSort(arr);
std::cout << "정렬 후 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
계수 정렬 (Counting Sort)
계수 정렬은 주어진 배열의 각 값의 개수를 세어 그 정보를 사용하여 정렬하는 비교 기반이 아닌 정렬 알고리즘입니다. 계수 정렬은 요소들이 특정 범위에 있는 경우에 매우 효율적입니다.
계수 정렬의 시간 복잡도:
- (O(n + k)), 여기서 (n)은 요소의 개수, (k)는 값의 범위입니다.
계수 정렬 구현
#include <iostream>
#include <vector>
// 계수 정렬 함수
void countingSort(std::vector<int>& arr) {
int maxVal = *std::max_element(arr.begin(), arr.end());
int minVal = *std::min_element(arr.begin(), arr.end());
int range = maxVal - minVal + 1;
std::vector<int> count(range), output(arr.size());
// 각 요소의 개수 세기
for (int i = 0; i < arr.size(); ++i) {
count[arr[i] - minVal]++;
}
// count[i]가 실제 위치를 가리키도록 조정
for (int i = 1; i < count.size(); ++i) {
count[i] += count[i - 1];
}
// 출력 배열에 정렬된 값 저장
for (int i = arr.size() - 1; i >= 0; --i) {
output[count[arr[i] - minVal] - 1] = arr[i];
count[arr[i] - minVal]--;
}
// 결과를 원래 배열에 복사
for (int i = 0; i < arr.size(); ++i) {
arr[i] = output[i];
}
}
int main() {
std::vector<int> arr = {4, 2, 2, 8, 3, 3, 1};
std::cout << "정렬 전 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
countingSort(arr);
std::cout << "정렬 후 배열: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
설명
- 기수 정렬 (Radix Sort):
- 각 자릿수를 기준으로 정렬하는 비교 기반이 아닌 정렬 알고리즘입니다.
- 계수 정렬을 사용하여 각 자릿수별로 정렬을 수행합니다.
- 시간 복잡도는 (O(d \times (n + k)))입니다.
- 계수 정렬 (Counting Sort):
- 주어진 배열의 각 값의 개수를 세어 정렬하는 비교 기반이 아닌 정렬 알고리즘입니다.
- 시간 복잡도는 (O(n + k))입니다.
기수 정렬과 계수 정렬의 기본 개념과 구현 방법을 이해했습니다. 다음 단계로 넘어가며, 더 복잡한 자료구조와 알고리즘을 학습해보겠습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 22: 이진 탐색"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++로 배우는 알고리즘과 자료구조 시리즈' 카테고리의 다른 글
[C++로 배우는 알고리즘과 자료구조] Day 22: 이진 탐색 (Binary Search) (0) | 2024.08.01 |
---|---|
[C++로 배우는 알고리즘과 자료구조] Day 20: 힙 정렬 (Heap Sort) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 18: 합병 정렬 (Merge Sort) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 19: 퀵 정렬 (Quick Sort) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 16: 버블 정렬과 선택 정렬 (0) | 2024.08.01 |