Allora, presupponento che è solo un esercizio, la funzione è ok ( a meno di una cavolata che ti scrivo in fondo)

Se segui mentalmente cosa accade quando chiami la funzione ti accorgi ogni valore viene scansionato dal tuo secondo IF, ovvero:
codice:
    if(first==last)
    {
        if(*(vett+first)==elemento)
        return 1;
        else
        return 0;

    }
Indi l'ultimo controllo e' inutile/dannoso, ovvero conti due volte lo stesso elemento.
Detto in altri termini, devi eliminare questa parte:
codice:
    if(*(vett+first)==elemento)
    {
        return parziale1+parziale2 +1;
    }
    else
    {
        return parziale1+parziale2 ;
    }
e sostituirla con:
codice:
      return parziale1 + parziale2;
tutto qua =)

per quanto riguarda quella cavolata a cui alludevo inizialmente, i primi due controlli non fanno uso delle variabili locali, indi e' inutile istanziare queste ultime prima =)
in altre parole:
codice:
      if(first==last)
         {
            if(*(vett+first)==elemento)
               return 1;
            else
               return 0;
         }
      if(first>last)
         return 0;

      int parziale1,parziale2;
      int pivot;
occupa meno memoria =)

Buon proseguimento di studio ^^