Cod sursa(job #1520518)

Utilizator jimcarterJim Carter jimcarter Data 8 noiembrie 2015 21:59:41
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
using namespace std;

FILE *f = fopen ( "algsort.in" , "r" ) , *g = fopen ( "algsort.out" , "w" );

const int MAX = 500005;
int Size , myInts [ MAX ] , i;

void read()
{
    fscanf ( f , "%d" , &Size );
    for ( i = 0 ; i < Size ; i ++ )
        fscanf ( f , "%d" , &myInts [ i ] );
}

void print()
{
    for ( i = 0 ; i < Size ; i ++ )
        fprintf ( g , "%d " , myInts [ i ] );
}

int partition ( int left , int right )
{
	int i , j , x;
	//pre: left < right, frame: only myInts[left..right) changes, by a permutation
	i = left + 1 , j = right;
	x = myInts [ left ];
	//inv: left < i <= j <= right & myInts[left..i-1) < x & x <= myInts[j..r)
	//myInts[left . . i − 1) ++ [x] ++ myInts[i . . right) is a permutation of initial myInts[left..right)
	while ( i != j )
	{
		while ( i != j && myInts [ i ] < x ) myInts [ i - 1 ] = myInts [ i ++ ];
		while ( i != j && x <= myInts [ j - 1 ] ) j --;
		if ( i != j ) //myInts [ j − 1 ] < x ≤ myInts [ i ] so i < j − 1
			myInts [ i - 1 ] = myInts [ j - 1 ] , myInts [ j - 1 ] = myInts [ i ] , i ++ , j --;
	}
	myInts [ i - 1 ] = x;
	return i - 1;
	//post: left ≤ i < right & a[left . . i) < x & myInts[i] = x & x ≤ a[i . . right)
	//myInts[left . . right) is a permutation of its initial value
}

void Qsort( int left , int right )
{
	if ( left + 1 < right )
	{
		//pre: left < right, frame: only myInts[left..right) changes, by a permutation
		int i = partition ( left , right ); //myInts[left . . i) < x & myInts[i] = x & x ≤ myInts[i . . right)
		Qsort ( left , i );
		Qsort ( i + 1 , right );
	}
}

int main()
{
    read();
    Qsort( 0 , Size );
    print();
    return 0;
}