Cod sursa(job #2073760)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 23 noiembrie 2017 17:49:53
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

int N,v[500005],b[500005],c[500005];

inline void Read()
{
    int i;
    ifstream fin("algsort.in");
    fin>>N;
    for(i=1;i<=N;i++)
        fin>>v[i];
    fin.close();
}

inline void Merge(int a[], int left, int right)
{
    int i,j,n1,n2;
    n1=0;
    for(i=left;i<=(left+right)/2;i++)
        b[++n1]=a[i];
    n2=0;
    for(i=(left+right)/2+1;i<=right;i++)
        c[++n2]=a[i];
    N=left-1;
    i=j=1;
    while(i<= n1 && j<= n2)
    {
        if(b[i]==c[j])
        {
            a[++N]=b[i];a[++N]=b[i];
            i++;j++;
        }
        else
            if(b[i]<c[j])
                a[++N]=b[i++];
            else
                a[++N]=c[j++];
    }
    while(i<= n1)
        a[++N]=b[i++];
    while(j<= n2)
        a[++N]=c[j++];
}

inline void MergeSort(int a[], int left, int right)
{
    if(left==right)
        return ; // sirul de 1 e deja sortat
    MergeSort(a,left,(left+right)/2);
    MergeSort(a,(left+right)/2+1,right);
    Merge(a,left,right);
}

inline void Write()
{
    int i;
    ofstream fout("algsort.out");
    for(i=1;i<=N;i++)
        fout<<v[i]<<" ";
    fout<<"\n";
    fout.close();
}

int main()
{
    Read();
    MergeSort(v,1,N);
    Write();
    return 0;
}