Cod sursa(job #372323)

Utilizator blasterzMircea Dima blasterz Data 9 decembrie 2009 11:33:33
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <algorithm>
#define N 500001

using namespace std;

#define dim 8192
int ax[dim];
int pz;

inline void cit(int &x)
{
    x = 0;
    while(ax[pz] < '0' || ax[pz] > '9')
	if(++pz == dim) fread(ax,1,dim,stdin),pz = 0;
    while(ax[pz] >= '0' && ax[pz] <= '9')
    {
	x = x * 10 + ax[pz] - '0';
	if(++pz == dim) fread(ax,1,dim,stdin),pz = 0;
    }
}

int n, a[N];

void read()
{
    freopen("algsort.in","r",stdin);
    scanf("%d\n", &n);
    
    for(int i = 1; i <= n; ++i)
	scanf("%d ", &a[i]);
}

inline int part(int a[], int l, int r)
{
    swap(a[l + rand()%(r-l) + 1], a[r]);
    int v = a[r];

    int j = l - 1;
    for(int i = l; i <= r; ++i)
	if(a[i] <= v)
	    swap(a[++j], a[i]);

    return j;
    
}

inline int part2(int a[], int l, int r)
{
    //swap(a[l + rand()%(r - l) + 1], a[l]);
    int v = a[l];

    int i = l, j = r;

    while(i <= j)
    {
	while(a[i] < v) ++i;
	while(a[j] > v) --j;

	if(i <= j)
	    swap(a[i++], a[j--]);
    }

    return i;
}
inline void quick(int a[], int l, int r)
{
    if(l >= r) return;

    int m = part2(a, l, r);
    quick(a, l, m - 1);
    quick(a, m,  r);
}

int main()
{
    read();
    quick(a, 1,  n);

//    sort(a+1, a+n+1);

    freopen("algsort.out","w",stdout);
    for(int i = 1; i <= n; ++i)
	printf("%d ", a[i]);
    printf("\n");
    return 0;
}