Non so come fare a vedere se l'errore sia in uscita o in entrata vi mostro anche il main dove ho testato l'applicazione e come potete vedere la funzione funziona se cambiate però la const N con numeri grandi come ad esempio 1 miliardo crasha. Per vedere i risultati più velocemente non fate stampare a video per numeri grandi nel main.
codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int Item;
void stampa(int* v,int x){
int i;
for(i=0;i<x;i++)
printf("%d**",*(v+i));
}
int isMinore(Item a,Item b){
if(a<b)
return 1;
return 0;
}
int isMaggiore(Item a,Item b){
if(a>b)
return 1;
return 0;
}
void scambia(Item* a,Item* b){
Item tmp=*a;
*a=*b;
*b=tmp;
}
int partiziona(Item a[],int i,int l,int r){
Item pivot=a[i]; //il pivot vale a[i] dove i è compreso fra l e r inclusi
while(l<r){ //finchè l è minore di r esegui il corpo
while(!isMaggiore(a[l],pivot)) //scorrendo da sinistra mi fermo
l=l+1; //quando trovo un elemento maggiore del pivot
while(!isMaggiore(pivot,a[r])) //scorrendo da destra mi fermo
r=r-1; //quando trovo un elemento minore del pivot
if(l<r){ //se l è minore di r allora effettuo lo scambio e
scambia(&a[l],&a[r]); //itero altrimenti non scambio ed esco
}
}
if (i>l){ //quando l >= r allora tutto l'array è ordinato ripsetto al
scambia(&a[i],&a[l]); //meno il pivot stesso che però è rimasto nella
return l; //posizione iniziale quindi lo scambio con l o r a
} //seconda se i si trova a destra di l o a sinistra di r e ritorno
else{ //il nuovo indice corrente del pivot
scambia(&a[i],&a[r]);
return r;
}
}
const int N=100;
int main(){
srand(time(NULL));
int* vettore=malloc(N*sizeof(int));
int i;
time_t t0, t1;
for(i=0;i<N-1;i++)
vettore[i]=rand();
stampa(vettore,N);
time(&t0);
int x=partiziona(vettore,8,0,N-1);
printf("\n%d\n",x);
time(&t1);
stampa(vettore,N);
printf("\nCi ho messo %f secs a ordinare %d elementi\n",difftime(t1,t0), N);
scanf("%d",&i);
return 0;
}