Método de Ordenamiento Por Selección

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


void ordenarSeleccionEnt(int * vec, size_t ce);
int * buscarMenorEnt(const int * vec, const int * fin);
void intercambiarEnt(int * e1, int * e2);

int main()
{
int vec[]={14,12,5,4,1,3,6,8,15,2,7,9,13,10,11};
int ce= sizeof(vec)/sizeof(int);
int i;
ordenarSeleccionEnt(vec, ce);


for (i=0; i<ce; i++)
{
printf(" %d |", vec[i]);
}

printf("\n");


return 0;
}

void ordenarSeleccionEnt(int * vec, size_t ce)
{
int * fin = vec + ce - 1,
* men;

while(vec < fin)
{
men = buscarMenorEnt(vec, fin);
if (vec!=men)
{
intercambiarEnt(vec, men);
}
vec++;
}
}

int * buscarMenorEnt(const int * vec, const int * fin)
{
const int * men = vec;
vec++;
while(vec <= fin)
{
if (*vec<*men)
{
men = vec;
}
vec++;
}
return (int *) men;
}

void intercambiarEnt(int * e1, int * e2)
{
int aux = *e1;
*e1 = *e2;
*e2 = aux;
}


Tomando como ejemplo el ejercicio anterior, la idea ahora es hacerlo genérico ya que en este caso no vamos a saber el tipo de dato que voy a recibir. Para esto voy a inicialmente convertir todo a void*. Luego de esto, cada vez que yo quiera correr mi puntero a otra posición voy a tener que sumarle el tamaño del tipo de dato. En mi caso va a ser entero por ende, voy a tener que pasarle tamElem como sizeof(int)