globularcluster
5/20/2014 - 3:18 AM

sorting with different modes of qsort

sorting with different modes of qsort

/*
 * Autor: Wagner F o Jr
 * Algoritmos e Estruturas de Dados I
 * Aula 7, Exercicio 1
 */

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

int main (int argc, char *argv[])
{
	void imprimeVet (int vet[], int ini, int fim);
	int compara1( const void *x, const void *y);
	int compara2( const void *x, const void *y);
	int compara3( const void *x, const void *y);
	int compara4( const void *x, const void *y);
	int compara5( const void *x, const void *y);

	int n, i;
	int (*ponteiro)(const void *, const void *);

	// Recebe o número de elementos do vetor
	scanf("%d", &n);
	int *vetor = (int *) malloc(sizeof(int)*n);
	
	// Recebe os elementos		
	for ( i = 0; i < n; i++ )
		scanf("%d", &vetor[i]);

	//imprimeVet(vetor, 0, n-1);

	printf("compara1:\n");
	ponteiro = &compara1;
	qsort( vetor, n, sizeof *vetor, ponteiro);
	imprimeVet(vetor, 0, n-1);

	printf("compara2:\n");
	ponteiro = &compara2;
	qsort( vetor, n, sizeof *vetor, ponteiro);
	imprimeVet(vetor, 0, n-1);

	printf("compara3:\n");
	ponteiro = &compara3;
	qsort( vetor, n, sizeof *vetor, ponteiro);
	imprimeVet(vetor, 0, n-1);

	printf("compara4:\n");
	ponteiro = &compara4;
	qsort( vetor, n, sizeof *vetor, ponteiro);
	imprimeVet(vetor, 0, n-1);

	printf("compara5:\n");
	ponteiro = &compara5;
	qsort( vetor, n, sizeof *vetor, ponteiro);
	imprimeVet(vetor, 0, n-1);

	return EXIT_SUCCESS;
}

void imprimeVet (int vet[], int ini, int fim)
{
	int i;
	printf("{");
	for( i=ini ; i<fim ; i++) {
		printf("%d, ", vet[i]);
	}
	printf("%d}\n\n", vet[fim]);
}

// Função compara1: o menor inteiro precede o maior (ordem crescente).
int compara1( const void *a, const void *b) {
	return (*(int *)a - *(int *)b); 
}

// Função compara2: o maior inteiro precede o menor (ordem decrescente)
int compara2( const void *a, const void *b) {
	return (*(int *)b - *(int *)a); 
}

// Função compara3: o inteiro ímpar precede o inteiro par, mas se ambos forem ímpar/par então o menor precede o maior
int compara3( const void *a, const void *b) {
	// conseguindo os valores passados
	int l = *(const int *)a;
	int r = *(const int *)b;
 
	// dois são impar, coloca o menor dos dois primeiro
	if ((l&1) && (r&1))
		return (l-r);
 
	// dois são par, coloca o menor dos dois primeiro
	if ( !(l&1) && !(r&1) )
		return (l-r);
 
	// l é par, coloca r primeiro
	if (!(l&1))
		return 1;
 
	// l é impar, coloca l primeiro
	return -1;
}

// Função compara4: o inteiro positivo precede o inteiro negativo, mas se ambos forem positivos, o menor precede o maior; e se ambos forem negativos, o maior precede o menor
int compara4( const void *a, const void *b) {
	// conseguindo os valores passados
	int l = *(const int *)a;
	int r = *(const int *)b;
 
	// dois são negativos, retorna o maior
	if ((l<0) && (r<0))
		return (r-l);
 
	// dois são posivos, retorna o menor
	if ((l>0) && (r>0))
		return (l-r);
 
	// l é positivo, retorna o maior
	if (l>0)
		return -1;
	
	return r;
}

// Função compara5: o menor inteiro precede o maior com base nos seus valores absolutos, mas se os valores absolutos forem iguais, o inteiro positivo precede o inteiro negativo
int compara5( const void *a, const void *b) {
	// conseguindo os valores passados
	int l = *(const int *)a;
	int r = *(const int *)b;
 
	// valores absolutos iguais, retorna o menor
	if ((abs(l)) == (abs(r)))
		return (r-l);

	// menor inteiro é retornado com base nos valores absolutos
	if ((abs(l)) > (abs(r)))
		return 1;
 
	return -1;
}