Language: C

#include <stdio.h>

#define SWAP( a, b ) do { int tmp; tmp = a; a = b; b = tmp; } while( 0 )

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

int n, data[ 1000000 ];

int main( void ) {
	int i, j;

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

	quickSort();

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

	return 0;
}

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

void quickSort_body( int l, int r ) {
	if ( l < r ) {
		int i = l, j = r;
		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;

			SWAP( data[ i ], data[ j ] );

			i++;
			j--;
		}

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

		if ( r - j < 20 )
			insertionSort( data + j + 1, r - j );
		else
			quickSort_body( data, 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( void ) {
	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:52:25: error: too many arguments to function 'insertionSort'
   52 |                         insertionSort( data + l, i - l );
      |                         ^~~~~~~~~~~~~
main.c:8:6: note: declared here
    8 | void insertionSort( void );
      |      ^~~~~~~~~~~~~
main.c:54:41: error: passing argument 1 of 'quickSort_body' makes integer from pointer without a cast [-Wint-conversion]
   54 |                         quickSort_body( data, l, i - 1 );
      |                                         ^~~~
      |                                         |
      |                                         int *
main.c:32:26: note: expected 'int' but argument is of type 'int *'
   32 | void quickSort_body( int l, int r ) {
      |                      ~~~~^
main.c:54:25: error: too many arguments to function 'quickSort_body'
   54 |                         quickSort_body( data, l, i - 1 );
      |                         ^~~~~~~~~~~~~~
main.c:32:6: note: declared here
   32 | void quickSort_body( int l, int r ) {
      |      ^~~~~~~~~~~~~~
main.c:57:25: error: too many arguments to function 'insertionSort'
   57 |                         insertionSort( data + j + 1, r - j );
      |                         ^~~~~~~~~~~~~
main.c:8:6: note: declared here
    8 | void insertionSort( void );
      |      ^~~~~~~~~~~~~
main.c:59:41: error: passing argument 1 of 'quickSort_body' makes integer from pointer without a cast [-Wint-conversion]
   59 |                         quickSort_body( data, j + 1, r );
      |                                         ^~~~
      |                                         |
      |                                         int *
main.c:32:26: note: expected 'int' but argument is of type 'int *'
   32 | void quickSort_body( int l, int r ) {
      |                      ~~~~^
main.c:59:25: error: too many arguments to function 'quickSort_body'
   59 |                         quickSort_body( data, j + 1, r );
      |                         ^~~~~~~~~~~~~~
main.c:32:6: note: declared here
   32 | void quickSort_body( int l, int r ) {
      |      ^~~~~~~~~~~~~~