Pagini recente » Cod sursa (job #322069) | Cod sursa (job #127571) | Cod sursa (job #2981336) | Cod sursa (job #2566039) | Cod sursa (job #1520518)
#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;
}