Cod sursa(job #1243517)

Utilizator obidanDan Ganea obidan Data 15 octombrie 2014 23:39:03
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
using namespace std;
int a[500002];
int chosePivot(int l, int r){
    if (r - l <= 2)
        return (l + r) / 2;

    int d = (rand() % (r - l + 1)) + l;
    int b = (rand() % (r - l + 1)) + l;
    int c = (rand() % (r - l + 1)) + l;

    if (a[d] >= a[b] && a[b] >= a[c])
        return b;
    else if (a[b] >= a[d] && a[d] >= a[c])
        return d;
    return c;
}
int Partition(int l, int r)
{
    int pind=chosePivot(l,r);
    int p=a[pind];
    int i,j=l-1;

    for(i=l;i<=r;i++)
    {
        if(a[i]<p)
        {
            swap(a[i],a[++j]);
            if(j==pind) pind=i;
        }
    }
    swap(a[pind],a[j+1]);
    return j+1;
}
void quicksort(int l, int r)
{
    if(l<r)
    {
        int p=Partition(l,r);
        quicksort(l,p-1);
        quicksort(p+1,r);
    }
}
int main()
{
    int i;
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    srand(time(NULL));
    int n;
    cin>>n;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    quicksort(0,n-1);
    for(int i=0;i<n;i++) cout<<a[i]<<" ";
}