알고리즘/9 정렬
[백준] 2751번 : 수 정렬하기2
우쭌쭈
2016. 6. 28. 16:55
[수 정렬하기]
https://www.acmicpc.net/problem/2751
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
수의 개수 N ( 1 <= N <= 1,000,000 )이 주어진다.
그 다음 줄 부터 N개의 줄에 걸쳐 숫자가 주어진다.
( 절대값은 1,000,000보다 작거나 같은 정수이며, 수는 중복되지 않는다. )
출력
N개의 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
제한조건
시간 : 1초
메모리 : 128MB
Solution
수를 정렬하는 다양한 방법이 존재한다.
그러나, 가장 쉽다고 여겨지는 선택정렬이나 버블정렬의 경우 O(N^2)이기 때문에 시간 안에 풀 수 없다.
때문에 여기서는 이 문제를 퀵소트를 이용하여 해결한다.
Source Code
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 31 32 33 34 35 36 37 38 39 40 41 42 | #include<stdio.h> #define MAX 1000000 // 데이터 개수의 MAX 범위 #define qSWAP(x, y) { int t = x; x = y; y = t; } // 간단한 SWAP 함수 int N, arr[MAX]; // 데이터 개수와 저장할 배열 void qSort(int *array, int left, int right) { int mLeft = left, mRight = right; int pivot = array[(left + right) / 2]; while(mLeft <= mRight) { while(pivot > array[mLeft]) mLeft++; while(pivot < array[mRight]) mRight--; if(mLeft <= mRight) { qSWAP(array[mLeft], array[mRight]); mLeft++, mRight--; } } if(left < mRight) qSort(arr, left, mRight); if(mLeft < right) qSort(arr, mLeft, right); } int main() { int idx; // 입력 scanf("%d", &N); for(idx = 0; idx < N; idx++) { scanf("%d", &arr[idx]); } qSort(arr, 0, N - 1); // 배열 인덱스 0 ~ N-1 까지 퀵소트 // 출력 for(idx = 0; idx < N; idx++) { printf("%d ", arr[idx]); } return 0; } | cs |
