#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define DataNum 20
void printfError();
void QuickSort( int a[], int s, int f );
int Partition( int a[], int s, int f );
void swap( int* a, int* b );
void InsertRank( int a[], int s, int f );
int RandPartition( int a[], int s, int f );
int main ( void ) {
FILE *fp = fopen("data.txt", "r");
if( !fp ) {
printfError();
}
int i = 0;
int a[DataNum];
for( i = 0; i < DataNum; i++ ) {
fscanf(fp, "%d", &a[i]);
}
QuickSort( a, 0, DataNum-1 );
for( i = 0; i < DataNum; i++ ) {
printf("%d ", a[i]);
}
return 0;
}
void printfError( ) {
printf("Space Error\n");
exit( 0 );
}
void QuickSort( int a[], int s, int f ) {
if( f - s <= 4 ) {
InsertRank( a, s, f );
return;
}
else {
int m = 0;
while( f - s >= 5 ) {
m = RandPartition( a, s, f );
QuickSort( a, s, m-1 );
s++;
}
}
}
int Partition( int a[], int s, int f ) {
int x = a[f];
int i = s-1;
int j = s;
for( j = s; j <= f-1; j++ ) {
if( a[j] < x ) {
i++;
swap( &a[i], &a[j] );
}
}
i = i+1;
swap( &a[i], &a[f] );
return i;
}
void swap( int* a, int* b ) {
int c = *b;
*b = *a;
*a = c;
}
void InsertRank( int a[], int s, int f ) {
int i = 0, j = 0;
int key = 0;
for( j = s+1; j <= f; j++ ) {
i = j-1;
key = a[j];
while( i >= s && key < a[i] ) {
a[i+1] = a[i];
i--;
}
i++;
a[i] = key;
}
}
int RandPartition( int a[], int s, int f ) {
int tmp = rand()%( f-s ) + s;
swap( &a[tmp], &a[f] );
return Partition( a, s, f );
}