Cod sursa(job #1754382)

Utilizator sulzandreiandrei sulzandrei Data 8 septembrie 2016 00:30:36
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define nmax 500003

ifstream in("algsort.in");
ofstream out("algsort.out");
/////////////////////////////////////////////////
////////
////////            qsort C library
////////
////////////////////////////////////////////////
int  comp(const void *a, const void * b)
{
    return *(int*)a - *(int*)b;
}
void qsortC(int *v, int n)
{
    qsort(v,n,sizeof(int),&comp);
}
/////////////////////////////////////////////////
////////
////////           mergesort scurt
////////
////////////////////////////////////////////////
const int N = 500000;
int B[N+2];
void merge_sort(int* A,int l, int r)//folosim merge sort in care avem si functia de spargere in jumatatie de intervale si
{                                   //combinarea intervalelor
    int m = (l + r) >> 1, i, j, k;
    if (l == r) return;
    merge_sort(A,l, m);//spargem in stanga
    merge_sort(A,m + 1, r);//spargem in dreapta
    for (i=l, j=m+1, k=l; i<=m || j<=r; )
        if (j > r || (i <= m && A[i] < A[j]))
            B[k++] = A[i++];
        else
            B[k++] = A[j++];
    for (k = l; k <= r; k++) A[k] = B[k];

}
/////////////////////////////////////////////////
////////
////////           mergesort clasic
////////
////////////////////////////////////////////////
void mergeit(int *A, int l , int r)
{
    int m =(l+r)/2, i = l, j = m+1, k = l;
    while(i <= m && j <= r)
        if( A[i]<= A[j])
            B[k++] = A[i++];
        else
            B[k++] = A[j++];
    while(i <= m )
        B[k++] = A[i++];
    while(j <= r )
        B[k++] = A[j++];
    for(int k = l ; k <= r ; k++)
        A[k] = B[k];
}
void mergesort(int *A, int l , int r)
{
    if(r - l >=1)
    {
        int mid = (l+r)/2;
        mergesort(A,l,mid);
        mergesort(A,mid+1,r);
        mergeit(A,l,r);
    }
}

int main()
{
    int n,i;
    in >> n;

    int heap[n+1];
    for( i = 0 ; i < n ; i++)
        in >> heap[i];
    //merge_sort(heap,0,n-1);//pozitia primullui element si ultimului element
    mergesort(heap,0,n-1);//mergesortul lung
    for(int i = 0 ; i < n ; i ++)
        out << heap[i] << " ";
    return 0;
}