Cod sursa(job #825636)

Utilizator maritimCristian Lambru maritim Data 29 noiembrie 2012 12:04:22
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;

FILE *f = fopen("algsort.in","r");
FILE *g = fopen("algsort.out","w");

int N;
int A[500100];

inline void swap(int &a,int &b)
{
    int aux = a;
    a = b;
    b = aux;
}

void afisare(void)
{
    for(int i=1;i<=N;i++)
        fprintf(g,"%d ",A[i]);
}

inline int pozQS(int li,int ls)
{
    int k = rand()%(ls-li);
    int i;

    swap(A[li+k],A[li]);

    for(i=li+1;i<=ls;)
        if(A[li] < A[i])
            swap(A[i],A[ls]),--ls;
        else
            ++i;

    swap(A[li],A[--i]);

    return i;
}

inline void InsertionSort(int li,int ls)
{
    int val,j;

    for(int i=li+1;i<=ls;i++)
    {
        val = A[i];
        for(j=i;j>li && A[j-1] > val;A[j]=A[j-1],--j);
        A[j] = val;
        //afisare();
    }
}

inline void QuickSort(int li,int ls)
{
    if(ls-li < 11)
    {
        InsertionSort(li,ls);
        return ;
    }

    int k = pozQS(li,ls);
    QuickSort(li,k-1);
    QuickSort(k+1,ls);
}

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

int main()
{
    citire();
    srand(time(NULL));
    QuickSort(1,N);

    afisare();
}