티스토리 뷰
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
본 문제는 정렬에 관한 문제입니다. 무분별한 C++ STL 사용으로 몇몇 정렬 알고리즘의 구현 방법을 잊은터라 정렬 알고리즘을 복습할겸 알고리즘 문제도 풀겸 일석이조의 효과를 누리고자 해당 문제를 풀었습니다.
코드를 제출하기전에 직감적으로
Quick Sort는 Divide, Conquer 단계로 구성되며 Recursive 하게 동작되는 In-place 알고리즘입니다.
1. Divide 단계에서는 Array A[p..r]를 Pivot A[q]를 기준으로 두 개의 Subarray A[p..q-1], A[q+1..r]로 분할합니다. 이때, A[p..q-1]
2. Conquer 단계에서는 나누어진 두 개의 Subarray A[p..q-1], A[q+1..r]를 정렬합니다. (by recursive calls to quicksort)
Divide 단계에서 선택되는 Pivot이 Array의 Median(중앙값)이라면 복잡도는
그렇게 제가 구현한 Quick Sort는 시간초과가 발생하였습니다. 아무래도 Worst Case 복잡도가
데이터에 상관없이 항상
Merge Sort의 경우 구현에 따라 차이가 있겠지만 대개
코드
#include <iostream>
using namespace std;
void merge(int* array, int* sorted_array, int l, int middle, int r)
{
int len = r - l + 1;
int i = l;
int j = middle + 1;
int k = 0;//정렬되는 원소들의 위치를 가르킴
while(i <= middle && j <= r)
{
sorted_array[k++] = (array[i] <= array[j])? array[i++]:array[j++];
}
//아래 두 while 문 중 실제로 한 조건에만 걸림 무.조.건
while(j <= r)
{
sorted_array[k++] = array[j++];
}
while(i <= middle)
{
sorted_array[k++] = array[i++];
}
for(int i = 0; i < len; i++)
{
array[l + i] = sorted_array[i];
}
}
void partition(int* array, int *sorted_array, int l, int r)
{
if(l < r)
{
int middle = (l + r) / 2;
partition(array, sorted_array, l, middle);
partition(array, sorted_array, middle + 1, r);
merge(array, sorted_array, l, middle, r);
}
}
void merge_sort(int* array, int l, int r)
{
int len = r-l+1;
if(len == 1) return;
int *sorted_array = new int[r-l+1];
partition(array, sorted_array, l, r);
delete[] sorted_array;
}
int main()
{
//freopen("2751.txt", "r", stdin);
int N;
int* array;
cin >> N;
array = new int[N];
for(int i = 0; i < N; i++) cin >> array[i];
merge_sort(array, 0, N-1);
for(int i = 0; i < N; i++) cout << array[i] << '\n';
delete[] array;
return 0;
}
'Problem Solving > 백준 온라인 저지' 카테고리의 다른 글
17837-새로운 게임 2 (0) | 2020.10.20 |
---|---|
2056-작업 (0) | 2020.10.15 |
9251-LCS(Longest Common Subsequence) (0) | 2020.10.07 |
2294-동전2 (0) | 2020.10.06 |
1015-수열정렬 (0) | 2020.09.29 |
- Total
- Today
- Yesterday
- FairMOT
- 단축키
- ㅂ
- 파이참
- C++ Deploy
- 백준 1766
- 문제집
- 인공지능을 위한 선형대수
- 순열
- LCA
- MOT
- 백준 11437
- 이분탐색
- Lowest Common Ancestor
- 백트래킹
- cosine
- 조합
- 자료구조
- 백준
- PyCharm
- 백준 11053
- 위상 정렬 알고리즘
- 가장 긴 증가하는 부분 수열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |