728x90
SMALL
백준 문제 풀이: 2751 [수 정렬하기 2]
문제 링크: https://www.acmicpc.net/problem/2751
문제 설명:
주어진 정수 n개의 수를 오름차순으로 정렬하는 문제입니다. 입력 범위가 크기 때문에 효율적인 알고리즘을 사용해야 합니다.
문제 해결 코드
#include <iostream>
#include <algorithm>
using namespace std;
// 퀵 정렬 함수
void quickSort(int* data, int start, int end) {
if (start >= end) {
return;
}
int key = start;
int i = start + 1;
int j = end;
while (i <= j) {
while (data[i] <= data[key] && i <= end) {
i++;
}
while (data[j] >= data[key] && j > start) {
j--;
}
if (i > j) {
int temp = data[j];
data[j] = data[key];
data[key] = temp;
}
else {
int temp = data[j];
data[j] = data[i];
data[i] = temp;
}
}
quickSort(data, start, j - 1);
quickSort(data, j + 1, end);
}
int arr[1000001];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
random_shuffle(arr, arr + n); // 랜덤 셔플을 통해 퀵 정렬의 성능 보장
quickSort(arr, 0, n - 1); // 퀵 정렬 호출
for (int i = 0; i < n; i++) {
cout << arr[i] << '\n'; // 정렬된 결과 출력
}
}
코드 설명
- 핵심 알고리즘: 퀵 정렬을 사용하여 데이터를 정렬합니다.
- 구현 세부사항:
- 퀵 정렬의 효율성을 보장하기 위해
random_shuffle
을 사용하여 배열을 섞습니다. - 분할 기준은 배열의 첫 번째 원소로 설정되며, 재귀적으로 왼쪽과 오른쪽 부분 배열을 정렬합니다.
- 정렬 후 배열의 각 원소를 출력합니다.
- 퀵 정렬의 효율성을 보장하기 위해
- 시간 복잡도: 평균 O(n log n), 최악의 경우 O(n2)
- 공간 복잡도: O(log n) (재귀 호출 스택 사용)
결과
입력된 수를 오름차순으로 빠르게 정렬하여 출력합니다. 퀵 정렬의 특성과 random_shuffle의 조합으로 평균적으로 높은 성능을 보장합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 수학' 카테고리의 다른 글
백준 4153번 [직각삼각형](C++)-yes6686- 티스토리 (0) | 2024.01.03 |
---|---|
백준 2869번 [달팽이는 올라가고 싶다](C++)-yes6686- 티스토리 (0) | 2024.01.03 |
백준 2609번 [최대공약수와 최소공배수](C++)-yes6686- 티스토리 (0) | 2024.01.02 |
백준 2292번 [벌집](C++)-yes6686- 티스토리 (0) | 2024.01.02 |
백준 2108번 [통계학](C++)-yes6686- 티스토리 (0) | 2024.01.02 |