Guarda, prova questo.
Studiai questo algoritmo diversi mesi fa e ora l'ho implementato di nuovo prendendolo da certi appunti... ho fatto diverse prove e dovrebbe funzionare.
In sostanza, anziché considerare singolarmente gli elementi dell'array, li considera a coppie, e nel complesso esegue 3n/2 confronti, questo perché il ciclo for ha uno step pari a 2, non 1, quindi se n è il numero delle componenti le iterazioni sono n/2 e, per ognuna di queste, vengono eseguiti 3 confronti, né più né meno. Quindi n/2 iterazioni con 3 confronti... T(n) = 3n/2, mentre invece con quello che proponevi tu facevi due confronti per ogni componente dell'array tranne la prima, quindi 2n - 2.
(Edit: comunque per quanto riguarda il codice del post precedente non so se va bene ma comunque l'errore è che l'ultima parentesi graffa chiude il for, non il main, quindi ne devi aggiungere un'altra)
codice:#include <stdio.h> #include <stdlib.h> #include <time.h> short i; void calcolo_min_max_media(int *x, short n, int *min, int *max, int *media) { *min = *max = *media = x[0]; for (i=1; i<n-1; i+=2) { if ( x[i] > x[i+1] ) { if ( x[i] > *max ) *max = x[i]; if ( x[i+1] < *min ) *min = x[i+1]; } else { if ( x[i] < *min ) *min = x[i]; if ( x[i+1] > *max ) *max = x[i+1]; } *media += x[i] + x[i+1]; } *media /= n; } int main(void) { int *array, min, max, media; short n; printf("Immettere il numero delle componenti dell'array: "); scanf("%hd%*c", &n); array = (int *)malloc( n*sizeof(int) ); srand( (unsigned int)time(NULL) ); printf("\nGenerazione e visualizzazione degli elementi dell'array:\n\n"); for (i=0; i<n; i++) { array[i] = rand(); printf("%-6d", array[i]); } puts("\n"); calcolo_min_max_media (array, n, &min, &max, &media); printf("Il minimo elemento dell'array e': %d\n" "Il massimo elemento dell'array e': %d\n" "La media degli elementi dell'array e': %d\n", min, max, media); getchar(); return 0; }

Rispondi quotando