수 정렬하기 3 성공
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
예제 입력
10 5 2 3 1 4 2 3 5 1 7
예제 출력
1 1 2 2 3 3 4 5 5 7
시간 제한이 5초이며 메모리가 8mb이므로
10,000,000 갯수의 입력 값을 정렬해야 하기 때문에
입력의 크기를 시간 복잡도에 대입해서 얻은 반복문 수행 횟수에 대해, 1초 당 반복문 수행 횟수가 1억()을 넘어가면 시간 제한을 초과할 가능성이 있다.1
위의 알고리즘 문제해결전략에서 참고한 수행속도 예측에 따르면,
1천만의 입력 갯수를 정렬할때 O(nlogn) 는 5초 약 5억의 반복횟수를 넘을 것이다.
또한 그나마 빠른 radix sort를 사용한다면 O(nk) 1천만 X 1만이기 때문에 1000억의 반복횟수를 넘는다.
Array Sorting Algorithms
Algorithm | Time Complexity | Space Complexity | ||
---|---|---|---|---|
Best | Average | Worst | Worst | |
Quicksort | Ω(n log(n)) | Θ(n log(n)) | O(n^2) | O(log(n)) |
Mergesort | Ω(n log(n)) | Θ(n log(n)) | O(n log(n)) | O(n) |
Timsort | Ω(n) | Θ(n log(n)) | O(n log(n)) | O(n) |
Heapsort | Ω(n log(n)) | Θ(n log(n)) | O(n log(n)) | O(1) |
Bubble Sort | Ω(n) | Θ(n^2) | O(n^2) | O(1) |
Insertion Sort | Ω(n) | Θ(n^2) | O(n^2) | O(1) |
Selection Sort | Ω(n^2) | Θ(n^2) | O(n^2) | O(1) |
Tree Sort | Ω(n log(n)) | Θ(n log(n)) | O(n^2) | O(n) |
Shell Sort | Ω(n log(n)) | Θ(n(log(n))^2) | O(n(log(n))^2) | O(1) |
Bucket Sort | Ω(n+k) | Θ(n+k) | O(n^2) | O(n) |
Radix Sort | Ω(nk) | Θ(nk) | O(nk) | O(n+k) |
Counting Sort | Ω(n+k) | Θ(n+k) | O(n+k) | O(k) |
Cubesort | Ω(n) | Θ(n log(n)) | O(n log(n)) | O(n) |
Radix와 Counting Sort의 최악의 경우의 시간과 공간의 복잡도가 입력 값의 개수와
숫자의 범위가 늘어나면 배로 커질 수 밖에 없다.
소스 코드
#include <stdio.h>
int main(){
int n=0,counts[10001]={0,},input=0;
//1 부터 10000 까지의 숫자 종류를 저장하기 위해 배열을 할당
scanf("%d",&n);
for(int i = 0; i<n; i++){
scanf("%d",&input);
counts[input]++;
//숫자에 인덱스를 위해 숫자의 갯수를 세어 저장
}
for(int i=1; i<=10000; i++)
counts[i] = counts[i] + counts[i-1];
//정렬될 숫자의 인덱스를 위해 누적을 시킴
for(int i=1; i<=10000; i++){
int index = counts[i]-counts[i-1];
if(i==1){
index = counts[i];
//첫 숫자는 전의 숫자와 비교할 필요가 없음
}
while(index--){
printf("%d\n",i);
//전 숫자와 차이만큼 숫자 출력
}
}
return 0;
}
'컴퓨터공학 > 알고리즘 공부' 카테고리의 다른 글
[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 [소풍] (0) | 2018.11.12 |
---|---|
[알고리즘 문제 해결 전략] Part 1. 6장 무식하게 풀기 (0) | 2018.10.27 |
Quicksort 2 - Sorting Hackerrank 퀵정렬 퀵소트 문제! (0) | 2017.01.06 |
Quicksort 1 - Partition Hackerrank 퀵소트 퀵정렬 알고리즘 (0) | 2017.01.06 |
Insertion Sort 삽입 정렬 Hackerrank (0) | 2017.01.06 |