Q:

¿Cual es la diferencia entre estos dos tipos de punteros?

Cual es exactamente la diferencia entre estos dos punteros si ambos están apuntando a una función.La verdad es que he visto muchos programadores usandolos pero yo sigo sin ver la diferencia.
int(*function)(int,int)  

y
int*function(int,int)

A:

Esto es un puntero a función:
int(*function)(int,int)

Se utiliza para apuntar de forma dinámica a una función:
int func1(int a, int b)
{ return a + b; }

int func2(int a, int b)
{ return a * b; }

int main()
{
  int (*funcion)(int,int) = func1;
  printf("%d\n",funcion(2,4)); // Imprime 6 (2 + 4)

  funcion = func2;
  printf("%d\n",funcion(2,4)); // Imprime 8 (2 * 4)
}

Y esto otro es una función que devuelve un puntero de tipo int:
int* function(int,int)

Como por ejemplo:
int* funcion(int a, int b)
{
  static int total= 0;
  total= a + b;
  return &total;
}

int main()
{
  int* resultado = funcion(1,2);
  printf("%d\n",*resultado); // Imprime 3
  funcion(2,4);
  printf("%d\n",*resultado); // Imprime 6
}

El segundo resultado se explica porque resultado apunta a la variable interna de la función, total. Al ser esta variable estática cada vez que se llama a la función se modificará el valor almacenado en la misma.
Los paréntesis son muy importantes en C, así que hay que ponerlos con sumo cuidado si no quieres que el programa empiece a hacer cosas raras.

