#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Resource
{
	int low;
	int length;
	int *data;
} Resource;

void Swap(int *first, int *second)
{
	int tmp = *first;
	*first = *second;
	*second = tmp;
}

void SortQuick(int **data, int *low, int *high)
{
	int i = *low,
		j = *high,
		x = (*data)[(*low + *high) / 2];

	do
	{
		while((*data)[i] < x) i++;
		while((*data)[j] > x) j--;

		if(i <= j)
		{
			Swap(&(*data)[i], &(*data)[j]);
			i++;
			j--;
		}

	} while(i <= j);

	if(i < *high) SortQuick(data, &i, high);
	if(*low < j) SortQuick(data, low, &j);
}

void ArrayPrint(int **data, int *array_length)
{
	for(int i = 0; i < *array_length; i++)
	{
		printf("[%i]: %i\r\n", i, (*data)[i]);
	}
}

void ArrayInit(int **data, int *array_length)
{
	(*data) = (int*)malloc(sizeof(int) * *array_length);

	for(int i = 0; i < *array_length; i++)
	{
		(*data)[i] = rand();
	}
}

int GlobalInit(Resource **data_resource)
{
	srand((unsigned int)rand());

	*data_resource = (Resource*)malloc(sizeof(Resource));
	(*data_resource)->low = 0;
	(*data_resource)->length = rand();

	ArrayInit(&(*data_resource)->data, &(*data_resource)->length);

	return (*data_resource)->length;
}

void BenchmarkTest(Resource **data_resource)
{
	ArrayPrint(&(*data_resource)->data, &(*data_resource)->length);
	SortQuick(&(*data_resource)->data, &(*data_resource)->low, &(*data_resource)->length - 1);
	ArrayPrint(&(*data_resource)->data, &(*data_resource)->length);
}

int main(void)
{
	Resource *data_resource = NULL;

	GlobalInit(&data_resource);
	BenchmarkTest(&data_resource);

	return 0;
}