Cod sursa(job #1213139)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 27 iulie 2014 12:21:40
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <iostream>
#define SIZE 500000
using namespace std;


ifstream ifs("algsort.in");
ofstream ofs("algsort.out");

int A[SIZE], B[SIZE], N;

inline int min(int a, int b)
{
    return (a < b ? a : b);
}

void merge(int left, int mid, int right)
{
    if (A[mid] < A[mid+1])
    {
        // There is no need for the merge phase
        return;
    }

    // Copy the data into the auxiliary array
    for (int i = left; i <= right; ++i)
    {
        B[i] = A[i];
    }
    
    int i = left;
    int j = mid+1;
    for (int k = left; k <= right; ++k)
    {
        if (i > mid) A[k] = B[j++];
        else if (j > right) A[k] = B[i++];
        else if (B[i] <= B[j]) A[k] = B[i++];
        else A[k] = B[j++];
    }
}

void bottom_up_mergesort(int left, int right)
{
    int N = right - left + 1;
    for (int step = 1; step < N; step += step)
    {
        for (int offset = left; offset < (right - step + 1); offset += step + step)
        {
            int m = min(offset + step + step - 1, right);
            merge(offset, offset + step - 1, m);
        }
    }
}

int main()
{
    ifs >> N;
    for (int i = 0; i < N; ++i)
    {
        ifs >> A[i];
    }
    
    bottom_up_mergesort(0, N-1);
    
    for (int i = 0; i < N; ++i)
    {
        ofs << A[i] << " ";
    }

    return 0;
}