Cod sursa(job #1144510)

Utilizator manciu_ionIon Manciu manciu_ion Data 17 martie 2014 11:02:16
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb

#include<iostream>
#include<fstream>

using namespace std;

void MergeSort(long int[],int,int);
void Interchange(long int[],int,int,int);

long int B[500005];

int main(){
    ifstream InFile("algsort.in");
    ofstream OutFile("algsort.out");

    long int A[500005]; int n;
    InFile>>n;

    for(int i=0;i<n;i++) InFile>>A[i];

    MergeSort(A,0,n-1);

    for(int i=0;i<n;i++) OutFile<<A[i]<<" ";
}

void MergeSort(long int A[],int st,int dr){
    if(st<dr){
        int mid=(st+dr)>>1;
        MergeSort(A,st,mid);
        MergeSort(A,mid+1,dr);
        Interchange(A,st,mid,dr);
    }
}

void Interchange(long int A[],int st,int mid,int dr){
    int k=st;
    int i=st,j=mid+1;
    for ( ; i<=mid && j<=dr; )
        if(A[i]<A[j]){
            B[k++]=A[i++];
        }else{
            B[k++]=A[j++];
        }

    for ( ; i<=mid; ) B[k++]=A[i++];

    for ( ; j<=dr;  ) B[k++]=A[j++];

    for(k=st;k<=dr;++k) A[k]=B[k];
}

/*
#include <iostream>
#include <cstdio>

using namespace std;

int N, A[500005];

void ReadData();
void Print();
void MSort(int , int );
void Interclasare(int , int , int );

int main()
{
    freopen("merge_sort.in", "rt", stdin);
    freopen("merge_sort.out", "wt", stdout);

    ReadData();
    MSort(1,N);
    Print();

    fclose(stdin);
    fclose(stdout);
    return 0;
}

void ReadData()
{
    scanf("%d", &N);
    int i;
    for (i = 1; i <= N; ++i)
    {
        scanf("%d", &A[i]);
    }
}

void Print()
{
    int i;
    for (i = 1; i <= N; ++i)
    {
        printf("%d ", A[i]);
    }
    printf("\n");
}

void MSort(int p, int q)
{
    if (q > p)
    {
        int m = (p+q)>>1;
        MSort(p,m);
        MSort(m+1,q);
        Interclasare(p,m,q);
    }
}

void Interclasare(int p, int m, int q)
{
    int i = p, j = m+1, k = i;
    int B[500005];

    for ( ; i <= m and j <= q; )
       if (A[i] < A[j])
           B[k++] = A[i++];
        else
           B[k++] = A[j++];
    for ( ; i <= m; B[k++] = A[i++]);
    for ( ; j <= q; B[k++] = A[j++]);
    for (i = p; i <= q;  ++i) A[i] = B[i];
}
*/