𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 2751번: 수 μ •λ ¬ν•˜κΈ° 2 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 2751번: 수 μ •λ ¬ν•˜κΈ° 2 - C++

.23 2021. 8. 7. 00:05
문제

N개의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μˆ˜κ°€ 주어진닀. 이 μˆ˜λŠ” μ ˆλŒ“κ°’μ΄ 1,000,000보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€. μˆ˜λŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ”λ‹€.

 

좜λ ₯

첫째 쀄뢀터 N개의 쀄에 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ κ²°κ³Όλ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.


μ •λ ¬ 문제.

μ²˜μŒμ— 퀡 μ •λ ¬λ‘œ ν’€μ—ˆμœΌλ‚˜ 제좜 전에 μŽ„ν•œ λŠλ‚Œμ΄ λ“€μ–΄ ꡬ글링을 ν•΄λ΄€λ”λ‹ˆ 퀡정렬은 μ΅œμ•…μ˜ 경우 μ‹œκ°„λ³΅μž‘λ„κ°€ O(n2)둜, μ‹œκ°„μ΄ˆκ³Όμ˜ μœ„ν—˜μ΄ μžˆλ‹€κ³  ν•˜λ”λΌ..

κ·Έλ¦¬ν•˜μ—¬ 병합 정렬을 κ΅¬ν˜„ν•˜μ—¬ ν’€μ—ˆλ‹€.

 

병합정렬 : πŸ”—

 

μ½”λ“œ
#include <cstdio>

void merge(int* sorted, int* arr, int begin, int mid, int end);
void mergeSort(int* sorted, int* arr, int begin, int end);
void printArr(int* arr, int n);

int main(void) {
    int n;
    scanf("%d", &n);

    int* arr = new int[n];
    int* sorted = new int[n];

    for(int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    mergeSort(sorted, arr, 0, n - 1);
    printArr(arr, n);

    delete[] arr;
    return 0;
}

void merge(int* sorted, int* arr, int begin, int mid, int end) {
    int i, j, k;
    i = begin;
    j = mid + 1;
    k = begin;

    while(i <= mid && j <= end) {
        if(arr[i] <= arr[j]) {
            sorted[k] = arr[i];
            i++;
        }
        else {
            sorted[k] = arr[j];
            j++;
        }
        k++;
    }
    if(i > mid) {
        for(int a = j; a <= end; a++, k++)
            sorted[k] = arr[a];
    }
    else {
        for(int a = i; a <= mid; a++, k++)
            sorted[k] = arr[a];
    }

    for(int a = begin; a <= end; a++)
        arr[a] = sorted[a];
}

void mergeSort(int* sorted, int* arr, int begin, int end) {
    int mid;
    if(begin < end) {
        mid = (begin + end) / 2;
        mergeSort(sorted, arr, begin, mid);
        mergeSort(sorted, arr, mid + 1, end);
        merge(sorted, arr, begin, mid, end);
    }
}

void printArr(int* arr, int n) {
    for(int i = 0; i < n; i++) {
        printf("%d\n", arr[i]);
    }
}

 

 

Comments