/* 
 * 
 */



/* Funções para gerência de contabilidade 
 *
 * customizações devem ser feitas aqui*/
#undef CALC_USER_TIME	/* Undefine CALC_USER_TIME*/

#define DO_COUNTING	/* Undefine DO_COUNTING se você não quer gerar 
		             estatisticas de # de comparações e movimentações
			     de registro */


/* Daqui para baixo, não mexa */
#ifdef DO_COUNTING
#define COUNT_RESET count_comp =(count_swap = 0)
#define COUNT_COMP count_comp++
#define COUNT_SWAP count_swap++
#ifndef DO_COUNT_GLOBAL
extern long count_comp;
extern long count_swap;
#endif /* ifndef ... */
#else
#define COUNT_COMP {}
#define COUNT_SWAP {}
#endif



#define BEEN_HERE printf("DEBUG, __LINE__=%i\n",__LINE__)


/* swap
 * 
 * Troca o conteudo de 2 variáveis
 *
 * int *a	- Ponteiro para a primeira variávei
 * int *b	- Ponteiro pra a segunda veriável
 */
inline void swap(int *a, int *b);

/* print_array
 *
 * Imprime os i primeiros  elementos de um array
 *
 * int A[]	- O array
 * int n	- Quantidade de elementos a serem impressos
 * char* nome	- Um nome para o array
 */
void print_array ( int A[], int n, char* nome);

/* Permut
 *
 * Implementação do professor para "embaralhar" um vetor de n-1 posições.
 * Posição inicia (0) é usada como sentinela!
 *
 * int A[]	- Array iniciado com os elementos a serem embaralhados
 * int n	- Valor de elementos do vetor, contando com a sentinela!!!
 */
void Permut(int A[], int n);

/* insertion_sort
 *
 * Realiza a ordenação usando o algoritmo insertion sort
 *
 * int A[]	- Velor de com os elementos a serem ordenados total
 * int n	- numero de elementos do vetor, contando com sentinela
 * int k	- numero de elementos de A[] que se deseja na ordenação, 
 * 		  contando com a sentinela.			
 */
void insertion_sort(int A[], int n);



/* partial_insertion_sort
 *
 * Realiza a ordenação parcial usando um alg. baseado no insertion sort
 *
 * int A[]	- Velor de com os elementos a serem ordenados parcialmente
 * int n	- numero de elementos do vetor, contando com sentinela
 * int k	- numero de elementos de A[] que se deseja na ordenação parcial, *		  contando com a sentinela.			
 */
void partial_insertion_sort( int A[], int n, int k);

/* partial_selection_sort
 *
 * Realiza a ordenação parcial usando um alg. baseado no selection sort
 *
 * int A[]	- Velor de com os elementos a serem ordenados parcialmente
 * int n	- numero de elementos do vetor, contando com sentinela
 * int k	- numero de elementos de A[] que se deseja na ordenação parcial, *		  contando com a sentinela.			
 */
void partial_selection_sort( int A[], int n, int k);


/* partial_heap_sort
 *
 * Realiza a ordenação parcial usando um alg. baseado no heapsort
 *
 * int A[]	- Velor de com os elementos a serem ordenados parcialmente
 * int n	- numero de elementos do vetor, contando com sentinela
 * int k	- numero de elementos de A[] que se deseja na ordenação parcial, *		  contando com a sentinela.			
 */
void partial_heap_sort( int A[], int n, int k);

void partial_quick_sort( int A[], int n, int k);
