Cod sursa(job #2296276)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 4 decembrie 2018 16:31:55
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>// 3 randomuri + mediana dintre ele
#include <fstream>
#include <cstdlib>
#include <time.h>
using namespace std;
int n,a[500001];
ifstream f("algsort.in");
ofstream g("algsort.out");
int partitionare(int st,int dr)
{
    int mij,aux,i,j,m,r1,r2,r3,minim,maxim;
    m=(st+dr)/2;
    r1=st+rand()%(dr-st+1);
    r2=st+rand()%(dr-st+1);
    r3=st+rand()%(dr-st+1);
    minim=r1;
    if(a[minim]>a[r2])
    {
        minim=r2;
    }
    if(a[minim]>a[r3])
    {
        minim=r3;
    }
    maxim=r1;
    if(a[maxim]<a[r2])
    {
        maxim=r2;
    }
    if(a[maxim]<a[r3])
    {
        maxim=r3;
    }
    if(r1!=minim && r1!=maxim)
    {
        swap(a[r1],a[m]);
    }
    if(r2!=minim && r2!=maxim)
    {
        swap(a[r2],a[m]);
    }
    if(r3!=minim && r3!=maxim)
    {
        swap(a[r3],a[m]);
    }
    i=st-1;
    j=dr+1;
    mij=a[m];
    while(i<j)
    {
        do
        {
            i++;
        }
        while(a[i]<mij);
        do
        {
            j--;
        }
        while(a[j]>mij);
        if(i<j)
        {
            aux=a[i];
            a[i]=a[j];
            a[j]=aux;
        }
    }
    return j;
}
void sortare(int st,int dr)
{
    int poz;
    if(st<dr)
    {
        poz=partitionare(st,dr);
        sortare(st,poz);
        sortare(poz+1,dr);
    }
}
int main()
{
    int i;
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>a[i];
    }
    srand(time(NULL));
    sortare(1,n);
    for(i=1;i<=n;i++)
        g<<a[i]<<" ";
    return 0;
}