Cod sursa(job #515718)

Utilizator marius135Dumitran Adrian Marius marius135 Data 22 decembrie 2010 11:20:00
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<iostream>
#include<time.h>
#include<stdio.h>
using namespace std;

void Quick(int* t,int st,int dr) //Sortarea rapida  (!)
 
{     int i=st,j=dr,w, piv = ( st + dr ) /2;

	int x = dr - st + 1;
	if( x > 50 )
		{int piv1 = st + rand() % x;
		int piv2 = st + rand() % x;
		int piv3 = st +  rand() % x;
		if( t[piv1] > t[piv2] ){
			piv2 = piv1 ^ piv2 ^( piv2 = piv1 );
		}
		if( t[piv1] > t[piv3])
		{
			piv3 = piv1 ^ piv3 ^( piv3 = piv1 );
		}
		if( t[piv2] > t[piv3])
		{
			piv3 = piv2 ^ piv3 ^( piv3 = piv2 );
		}
		piv = t[piv2];
	}
   
 do   {
	  while(t[i] < piv) i++; 
	  while(t[j] > piv) j--;
      if(i <= j) {w=t[i]; t[i]=t[j]; t[j]=w; i++; j--;}
      }
  while(j >= i);
 
	 if(st < j) Quick(t,st,j);
	 if(dr > i) Quick(t,i,dr);
 }

int i,v[500001],n;

int main()
{
	srand(time(0));
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	

cin>>n;

for(i=1;i<=n;i++)
{
	
	cin>>v[i];
}

Quick(v,1,n);

for(i=1;i<=n;i++)
	cout<<v[i]<<" ";

cin>>i;
}