Cod sursa(job #674033)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 5 februarie 2012 14:05:46
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <string.h>

int a[500000];
int aux[500000];

void merge(int i1, int i2)
{
    if (i1 == i2)
        return;

    int m = (i1 + i2) / 2;

    merge(i1, m);
    merge(m + 1, i2);

    int index1 = i1, index2 = m + 1, index = 0;
    while (index1 <= m && index2 <= i2) {
        if (a[index1] < a[index2]) {
            aux[index++] = a[index1++];
            continue;
        }
        
        if (a[index2] < a[index1]) {
            aux[index++] = a[index2++];
            continue;
        }

        aux[index++] = a[index1++];
        aux[index++] = a[index2++];
    }

    while (index1 <= m) 
        aux[index++] = a[index1++];
    
    while (index2 <= i2) 
        aux[index++] = a[index2++];

    memcpy(&(a[i1]), aux, index * sizeof(int));
}

int main()
{
    int n;

    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d ", &a[i]);

    merge(0, n - 1);
    
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}