Cod sursa(job #342571)

Utilizator RobybrasovRobert Hangu Robybrasov Data 22 august 2009 13:26:30
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
//Quicksort care partitioneaza tot timpul in doua bucati de n/2
#include <cstdio>
#include <cstdlib>
#define N 500001
#define S_MAX 65536

int A[N];
int poz=-1;
char S[S_MAX];

//partitioneaza tot timpul in doua parti de n/2
int part(int a, int b, int k)
{
    if (a==b) return a;

    int i,j,t,p=a,q=b,r=a+rand()%(b-a)+1;
    t=A[a]; A[a]=A[r]; A[r]=t;
    //partitioneaza
    for (i=0, j=-1; a<b; a+=i, b+=j)
        if (A[a]>=A[b])
        {
            t=A[a]; A[a]=A[b]; A[b]=t;
            t=i; i=-j; j=-t;
        }

    if (a==k) return a;
    if (a>k) return part(p,a-1,k);
    else return part(a+1,q,k);
}

void sort(int a, int b)
{
    if (a<b)
    {
        int m=part(a,b,(a+b)>>1);
        sort(a,m-1);
        sort(m+1,b);
    }
}

void read(int &x)
{
    x=0;
    for (; S[poz]<'0' || S[poz]>'9'; ++poz)
        if (poz==S_MAX-1)
        {
            fread(S,1,S_MAX,stdin);
            poz=-1;
        }

    for (; S[poz]>='0' && S[poz]<='9'; ++poz)
    {
        x=10*x+S[poz]-'0';
        if (poz==S_MAX-1)
        {
            fread(S,1,S_MAX,stdin);
            poz=-1;
        }
    }
}

int main()
{
    int n,i;
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	fread(S,1,S_MAX,stdin);
	read(n);
	for (i=1; i<=n; i++) read(A[i]);

    sort(1,n);

    for (i=1; i<=n; i++) printf("%d ",A[i]);

	return 0;
}