Cod sursa(job #738625)

Utilizator galbenugalbenu dorin galbenu Data 21 aprilie 2012 10:37:22
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<algorithm>
#define lmax 500050
#define ISCONSTANT 15
#define in "r"
#define out "w"
using namespace std;
FILE *f=fopen("algsort.in",in),*g=fopen("algsort.out",out);
int n,i,a[lmax];
int partitie(int ,int );
void schimbint(int &a,int &b)
{
    int aux;
    aux=a;
    a=b;
    b=aux;
}
void insertion_sort(int s,int d)
{
    int key,i,j;
    for(j=s; j<=d; j++)
    {
        key=a[j];
        i=j-1;
        while(a[i]>key   && i>=0)
            a[i+1]=a[i],i--;
        a[i+1]=key;
    }

}
int partitie(int  s,int  d)
{
    schimbint(a[s],a[s+rand()%(d-s)]);
    int pivot=a[s],i,j;
    i=s;
    for(j=s+1; j<=d; j++)
        if(a[j]<=pivot)
        {
            i++;
            schimbint(a[i],a[j]);
        }
    schimbint(a[s],a[i]);
    return i;
}
void qs(int  s,int  d)
{
    int m;
    if(s<d && d-s>ISCONSTANT)
    {
        m=partitie(s,d);
        qs(s,m-1);
        qs(m+1,d);
    }
    else if(s<d)
        insertion_sort(s,d);
}
void show_vector()
{
    int i;
    for(i=1; i<=n; i++)
        fprintf(g,"%d ",a[i]);
}
void read()
{
    int i;
    fscanf (f,"%d",&n);
    for(i=1; i<=n; i++)
        fscanf(f,"%d",&a[i]);
}
int main()
{
    read();
    qs(1,n);
    show_vector();
    fclose(f);
    fclose(g);
    return 0;
}