Ordenamiento por Selección Genérico

Prototipo de la función para realizar el ordenamiento por selección:

void selection_sort(void *base, size_t nmemb, size_t tamanyo, int (*comparar)(const void *, const void *));

Ordena un array de nmemb objetos. El elemento inicial es apuntado por base. El tamaño de cada elemento del array está especificado por tamanyo. El contenido del array es ordenado de forma ascendente según una función de comparación apuntada por comparar, la cual es llamada con dos argumentos que apuntan a los objetos a ser comparados. La función retornará un entero menor, igual, o mayor que cero si el primer objeto es considerado, respectivamente a ser menor, igual, o mayor que el segundo.

Para realizar un ordenamiento de vectores cuyos elementos sean de cualquier tipo de dato utilizando el algoritmo de ordenamiento por selección:

void ordenar_seleccion_gen(void* vector, size_t tam, size_t tam_elem, int (*comparar)(const void*, const void*))
{
 int i;
 void* menor;
 for(i=0; i<tam-1; i++)
  {
     menor= buscar_menor (vector, tam-i, tam_elem, comparar);
     if(comparar(menor, vector)!=0)
     {
         intercambiar(menor, vector, tam_elem);
     }
     vector+=tam_elem;
  }
}
void* buscar_menor (void* vec, size_t tam, size_t tam_elem, int(*comparar)(const void*, const void*))
{
void* auxmenor;
auxmenor= vec;
int i;
for (i=0; i<tam-1; i++)
{
     vec+=tam_elem;
     if(comparar(vec, auxmenor)<0)
     {
         auxmenor=vec;
     }
}
return auxmenor;
}
void intercambiar (void* menor, void* vector, size_t tam_e)
{
void* aux;
aux=malloc(tam_e);
memcpy(aux, vector, tam_e);
memcpy(vector, menor, tam_e);
memcpy(menor, aux, tam_e);
free(aux);
}

Para ordenar los empleados, por ejemplo, por apellido:

int comparar_emp_ap (const void* p1, const void* p2)
{
 t_Empleado * emp1 = (t_Empleado*)p1;
 t_Empleado * emp2 = (t_Empleado*)p2;
 return strcmpi (emp1->apellido,emp2->apellido);
}