Cod sursa(job #867066)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 29 ianuarie 2013 09:12:35
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <stdlib.h>
#include <time.h>
#define NMAX 1000004
using namespace std;

ifstream in("algsort.in");
ofstream out("algsort.out");

int N,V[NMAX];

void PartitionLumoto(int left,int right, int &poz)
{
    int pivot = V[right], st = left,aux;
    poz = left-1;
    while(st <= right)
    {
        if(V[st] <= pivot)
            poz++,aux = V[st],V[st] = V[poz], V[poz] = aux;
        st++;
    }
    if(poz>=right)
        poz--;
}

void Partition(int left,int right,int &poz)
{
    int st = left, dr = right, pivot = V[poz], aux;
    while(st<dr)
    {
        // <-
        while(V[dr]>pivot && dr>poz) dr--;
        if(V[dr] < pivot)
            V[poz] = V[dr], V[dr] = pivot, poz = dr;
        while(V[st]<pivot && st<poz) st++;
        if(V[st] > pivot)
            V[poz] = V[st], V[st] = pivot, poz = st;
    }
}

void QSort(int left,int right)
{
    if(left >= right)return;
    int poz = left; //+ rand()%(right-left+1);
    PartitionLumoto(left,right,poz);

    QSort(left,poz),QSort(poz+1,right);
}

int main()
{
    int i;
    in>>N;
    for(i=1;i<=N;i++)
        in>>V[i];
    srand(time(NULL));
    QSort(1,N);
    for(i=1;i<=N;i++)
        out<<V[i]<<' ';
    return 0;
}