Language: C

#include <stdio.h>

void quickSort( int *, int );
void quickSort_body( int *, int, int );
int median( int, int, int );
void insertionSort( int *, int );

int n, data[ 1000000 ];

int main( void ) {
	int i, j;

	scanf( "%d", &n );
	for ( i = n; i--; scanf( "%d", data + i ) ) ;

	quickSort( data, n );

	for ( i = 0; i < n - 1; i++ )
		printf( "%d ", data[ i ] );
	printf( "%d\n", data[ n - 1 ] );

	return 0;
}

void quickSort( int *data, int n ) {
	quickSort_body( data, 0, n - 1 );
}

void quickSort_body( int *data, int l, int r ) {
	if ( l < r ) {
		int i = l, j = r, tmp;
		int pivot = median( data[ i ], data[ ( i + j ) / 2 ], data[ j ] );

		while ( 1 ) {
			while ( data[ i ] < pivot )
				i++;
			while ( pivot < data [ j ] )
				j--;
			if ( i >= j )
				break;

			tmp = data[ i ];
			data[ i ] = data[ j ];
			data[ j ] = tmp;

			i++;
			j--;
		}

		if ( i - l < 20 )
			insertionSort( data + l, i - l );
		else
			quickSort_body( l, i - 1 );

		if ( r - j < 20 )
			insertionSort( data + j + 1, r - j );
		else
			quickSort_body( j + 1, r );
	}
}

int median( int x, int y, int z ) {
	if ( x < y )
		if ( y < z )
			return y;
		else
			if ( z < x )
				return x;
			else
				return z;
	else
		if ( z < y )
			return y;
		else
			if ( x < z )
				return x;
			else
				return z;
}

void insertionSort( int *data, int n ) {
	int i, j, tmp;

	for ( i = 1; i < n; i++ ) {
		tmp = data[ i ];

		if ( data[ i - 1 ] > tmp ) {
			j = i;
			do {
				data[ j ] = data[ j - 1 ];
				j--;
			} while ( j > 0 && data[ j - 1 ] > tmp );
			data[ j ] = tmp;
		}
	}
}

Compiler output:
main.c: In function 'quickSort_body':
main.c:53:41: error: passing argument 1 of 'quickSort_body' makes pointer from integer without a cast [-Wint-conversion]
   53 |                         quickSort_body( l, i - 1 );
      |                                         ^
      |                                         |
      |                                         int
main.c:29:27: note: expected 'int *' but argument is of type 'int'
   29 | void quickSort_body( int *data, int l, int r ) {
      |                      ~~~~~^~~~
main.c:53:25: error: too few arguments to function 'quickSort_body'
   53 |                         quickSort_body( l, i - 1 );
      |                         ^~~~~~~~~~~~~~
main.c:29:6: note: declared here
   29 | void quickSort_body( int *data, int l, int r ) {
      |      ^~~~~~~~~~~~~~
main.c:58:43: error: passing argument 1 of 'quickSort_body' makes pointer from integer without a cast [-Wint-conversion]
   58 |                         quickSort_body( j + 1, r );
      |                                         ~~^~~
      |                                           |
      |                                           int
main.c:29:27: note: expected 'int *' but argument is of type 'int'
   29 | void quickSort_body( int *data, int l, int r ) {
      |                      ~~~~~^~~~
main.c:58:25: error: too few arguments to function 'quickSort_body'
   58 |                         quickSort_body( j + 1, r );
      |                         ^~~~~~~~~~~~~~
main.c:29:6: note: declared here
   29 | void quickSort_body( int *data, int l, int r ) {
      |      ^~~~~~~~~~~~~~