Pagini recente » Cod sursa (job #401718) | Cod sursa (job #1688014) | Cod sursa (job #502627) | Cod sursa (job #1060399) | Cod sursa (job #2296276)
#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;
}