2751๋ฒ: ์ ์ ๋ ฌํ๊ธฐ 2
์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 โค N โค 1,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ซ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ์๋ ์ ๋๊ฐ์ด 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ์๋ ์ค๋ณต๋์ง ์๋๋ค.
www.acmicpc.net
๋ฌธ์
N๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 โค N โค 1,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ซ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ์๋ ์ ๋๊ฐ์ด 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ์๋ ์ค๋ณต๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฒฐ๊ณผ๋ฅผ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
5 5 4 3 2 1
์์ ์ถ๋ ฅ 1
1 2 3 4 5
ํ์ด
์๊ฐ๋ณต์ก๋๊ฐ O(nlogn)์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๋ผ๊ณ ๋ช ์
import java.io.*;
import java.util.Scanner;
public class B2751 {
โ
โstatic int[] buff;
โ
โstatic void mergeSort(int[] a, int left, int right) {
โโif(left < right) {
โโโint i;
โโโint center = (left + right) /2;
โโโint p = 0;
โโโint j = 0;
โโโint k = left;
โโโ
โโโmergeSort(a, left, center);
โโโmergeSort(a, center + 1, right);
โโโ
โโโfor(i = left; i <= center; i++)
โโโโbuff[p++] = a[i];
โโโwhile(i <= right && j < p)
โโโโa[k++] = (buff[j] <= a[i]) ? buff[j++] : a[i++];
โโโโโ
โโโwhile(j < p)
โโโโa[k++] = buff[j++];
โโ}
โ}
โ
โstatic void mergeSort(int[] a, int n) {
โโbuff = new int[n];
โโmergeSort(a, 0, n-1);
โโbuff = null;
โ}
โ
โstatic void swap(int[]a, int idx1, int idx2) {
โโint t = a[idx1];
โโa[idx1] = a[idx2];
โโa[idx2] = t;
โ}
โ
โstatic void downHeap(int[] a, int left, int right) {
โโint temp = a[left];
โโint child;
โโint parent;
โโ
โโfor(parent = left; parent <(right+1)/2; parent = child) {
โโโint cl = parent * 2 +1;
โโโint cr = cl + 1;
โโโchild = (cr <= right && a[cr] > a[cl]) ? cr : cl;
โโโif(temp >= a[child])
โโโโbreak;
โโโa[parent] = a[child];
โโ}
โโa[parent] = temp;
โ}
โ
โstatic void heapSort(int[] a, int n) {
โโfor(int i = (n-1)/2; i >= 0; i--)
โโโdownHeap(a, i, n - 1);
โโ
โโfor(int i = n-1; i > 0; i--) {
โโโswap(a, 0, i);
โโโdownHeap(a, 0, i-1);
โโ}
โ}
โpublic static void main(String[] args) throws IOException {
โโScanner sc = new Scanner(System.in);
โโBufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
โโ
โโint n = sc.nextInt();
โโint[] sort = new int[n];
โโ
โโfor(int i = 0; i < n; i++) {
โโโsort[i] = sc.nextInt();
โโ}
โโ
โโmergeSort(sort, n); // ํฉ๋ณ ์ ๋ ฌ
โโ//heapSort(sort, n); // ํ ์ ๋ ฌ
โโ
โโ
โโfor(int i = 0; i < n; i++) {
โโโbw.write(Integer.toString(sort[i]) +"\n");
โโ}
โโbw.flush();
โ}
}