Cod sursa(job #2025942)

Utilizator dacianouaPapadia Mortala dacianoua Data 23 septembrie 2017 14:35:03
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define nmax 500000
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int n;
long long a[nmax+5];
void Insertion_Sort(long long arr[],int n)
{
    int i,key,j;
    for(i=2;i<=n;i++)
    {
        key=arr[i];
        j=i-1;
        while(j>=0 && arr[j]>key)
        {
            arr[j+1]=arr[j];
            j--;}
            arr[j+1]=key;
        }
}
void merge_Sort(long long arr[],int l,int m, int r)
{
    long long R[(nmax+5)/2],L[(nmax+5)/2];
    for(int Ri=1,i=l;i<=m;i++,Ri++)
        R[Ri]=arr[i];
    for(int Li=1,i=m+1;i<=r;Li++,i++)
        L[Li]=arr[i];
    int i=0,j=0,k=l;
    int n1 = m - l + 1;
    int n2 =  r - m;
     while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }

    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }

}
void Merge_Sort(long long arr[],int l, int r)
{
    if(l<r)
    {
        int m=l+(r-l)/2;
        Merge_Sort(arr,l,m);
        Merge_Sort(arr,m+1,r);
        merge_Sort(arr,l,m,r);
    }
}
void Quick_Sort(long long arr[],int l,int r)
{
    int i=l,j=r;
    int tmp;
    int pivot=arr[l+(r-l)/2];
    while(i<=j)
    {
        while(arr[i]<pivot)
            i++;
        while(arr[j]>pivot)
            j--;
        if(i<=j)
        {
            tmp=arr[i];
            arr[i]=arr[j];
            arr[j]=tmp;
            i++;
            j--;
        }
    }
    if (l < j)
            Quick_Sort(arr, l, j);
      if (i < r)
            Quick_Sort(arr, i, r);
}
void Intro_Sort(long long arr[],int n)
{
    if(n<=16)
        Insertion_Sort(arr,n);
    else if(log(n)==0)
        Merge_Sort(arr,1,n);
    else
        Quick_Sort(arr,1,n);

}
int main()
{
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    Intro_Sort(a,n);
    for(int i=1;i<=n;i++)
        if(i==n)
            fout<<a[i];
        else
            fout<<a[i]<<" ";
    return 0;
}