La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità

Presentazioni simili


Presentazione sul tema: "6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità"— Transcript della presentazione:

1 6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità di dati da ordinare Bubble sort (ordinamento a bolle) –Passaggi successivi: ad ogni passaggio i valori più piccoli risalgono in cima al vettore, mentre i i valori più grandi cadono in basso al vettore. –Lordinamento viene raggiunto attraverso la comparazione di una coppia di elementi Se si riscontra un ordine crescente (o uguale ), nessun cambiamento Se si riscontra un ordine decrescente, si scambiano gli elementi –Si itera questo meccanismo Esempio: inzio: passo 1: passo 2:

2 6.7Case Study: Calcolo della media, mediana e moda usando i vettori Mean - media Median – mediana è il valore di mezzo della lista ordinata (In particolare, la mediana è un indice di posizione, mentre la media è un indice rappresentativo, perché sintetizza un insieme di dati attraverso un singolo numero) –1, 2, 3, 4, 5 3 è la mediana Moda – il valore più frequente –1, 1, 1, 2, 3, 3, 4, 5 1 è la moda

3 Outline 1. Prototipidi Funzione 1.1 array inizializzazione 2. Chiamata alle funzioni mean, median, e mode 1/* Fig. 6.16: fig06_16.c 2 Questo programma introduce largomento dellanalisi dei dati 3 in un indagine. Calcola la media, la mediana e la moda dei dati */ 4#include 5#define SIZE void mean( const int [] ); 8void median( int [] ); 9void mode( int [], const int [] ) ; 10void bubbleSort( int [] ); 11void printArray( const int [] ); 12 13int main() 14{ 15 int frequency[ 10 ] = { 0 }; 16 int response[ SIZE ] = 17 { 6, 7, 8, 9, 8, 7, 8, 9, 8, 9, 18 7, 8, 9, 5, 9, 8, 7, 8, 7, 8, 19 6, 7, 8, 9, 3, 9, 8, 7, 8, 7, 20 7, 8, 9, 8, 9, 8, 9, 7, 8, 9, 21 6, 7, 8, 7, 8, 7, 9, 8, 9, 2, 22 7, 8, 9, 8, 9, 8, 9, 7, 5, 3, 23 5, 6, 7, 2, 5, 3, 9, 4, 6, 4, 24 7, 8, 9, 6, 8, 7, 8, 9, 7, 8, 25 7, 4, 4, 2, 5, 3, 8, 7, 5, 6, 26 4, 5, 6, 1, 6, 5, 7, 8, 7 }; mean( response ); 29 median( response ); 30 mode( frequency, response ); 31 return 0; 32}

4 Outline 3. definizione funzione mean 3.1 definizione funzione median ordinamento del vettore Print middle element 33 34void mean( const int answer[] ) 35{ 36 int j, total = 0; printf( "%s\n%s\n%s\n", "********", " Media", "********" ); for ( j = 0; j <= SIZE - 1; j++ ) 41 total += answer[ j ]; printf( La media è il valore medio dei valori dei dati\n" 44 La media è uguale al totale di\n" 45 tutti i valori dei dati diviso il mumero\n" 46 valori ( %d ). Il valor medio per\n" 47 questa esecuzione è: %d / %d = %.4f\n\n", 48 SIZE, total, SIZE, ( double ) total / SIZE ); 49} 50 51void median( int answer[] ) 52{ 53 printf( "\n%s\n%s\n%s\n%s", 54 "********", " Mediana", "********", 55 Larray non ordinato di valutazioni è" ); printArray( answer ); 58 bubbleSort( answer ); 59 printf( "\n\Larray ordinato è" ); 60 printArray( answer ); 61 printf( "\n\nLelemento mediano è %d dello\n" 62 array ordinato di %d elementi.\n" 63 Per questa esecuzione la mediana è %d\n\n", 64 SIZE / 2, SIZE, answer[ SIZE / 2 ] );

5 Outline 65} 66 67void mode( int freq[], const int answer[] ) 68{ 69 int rating, j, h, largest = 0, modeValue = 0; printf( "\n%s\n%s\n%s\n", 72 "********", " Moda", "********" ); for ( rating = 1; rating <= 9; rating++ ) 75 freq[ rating ] = 0; for ( j = 0; j <= SIZE - 1; j++ ) 78 ++freq[ answer[ j ] ]; printf( "%s%11s%19s\n\n%54s\n%54s\n\n", 81 Response", Frequency", Histogram", 82 " ", " " ); for ( rating = 1; rating <= 9; rating++ ) { 85 printf( "%8d%11d ", rating, freq[ rating ] ); if ( freq[ rating ] > largest ) { 88 largest = freq[ rating ]; 89 modeValue = rating; 90 } for ( h = 1; h <= freq[ rating ]; h++ ) 93 printf( "*" ); definizione funzione mode frequency[] aumenta in funzione di response[] Nota che lindice in frequency[] è il valore di un elemento in response[] ( answer[] ) Stampa stella in funzione del valore di frequency[]

6 Outline 3.3 definizione funzione bubbleSort 3.3 definizione funzione printArray 95 printf( "\n" ); 96 } printf( La moda è il valore più frequente.\n" 99 Per questa esecuzione il valore della moda è %d che 100 " ricorre %d volte.\n", modeValue, largest ); 101} void bubbleSort( int a[] ) 104{ 105 int pass, j, hold; for ( pass = 1; pass <= SIZE - 1; pass++ ) for ( j = 0; j <= SIZE - 2; j++ ) if ( a[ j ] > a[ j + 1 ] ) { 112 hold = a[ j ]; 113 a[ j ] = a[ j + 1 ]; 114 a[ j + 1 ] = hold; 115 } 116} void printArray( const int a[] ) 119{ 120 int j; for ( j = 0; j <= SIZE - 1; j++ ) { if ( j % 20 == 0 ) 125 printf( "\n" ); Bubble sort: se lelemento è fuori ordine, scambialo

7 Outline Program Output printf( "%2d", a[ j ] ); 128 } 129} ******** Mean ******** La media è il valore medio dei valori dei dati La media è uguale al totale di tutti i valori dei dati diviso il mumero valori ( 99 ). Il valor medio per Questa esecuzione è: 681 / 99 = ******** Mediana ******** Larray non ordinato di valutazioni è Larray ordinato è La mediana è lelemento 49 dello array ordinato di 99 elementi. Per questa esecuzione la mediana è 7

8 Outline Program Output ******** Mode ******** Response Frequency Histogram * 2 3 *** 3 4 **** 4 5 ***** 5 8 ******** 6 9 ********* 7 23 *********************** 8 27 *************************** 9 19 ******************* La moda è il valore più frequente. Per questa esecuzione la moda è 8 che ricorre 27 volte.

9

10 6.8Ricerca in un Vettore: Ricerca Lineare e Ricerca Binaria Si ricerca un elemento che corrisponda a un dato valore chiave (key value) Ricerca Lineare –semplice –Confronta ogni elemento del vettore con la chiave di ricerca –Utile per vettori piccoli e non ordinati

11 Ricerca lineare in un array #include #define SIZE 100 int linearSearch(const int [], int, int ); int main(){ int a[ SIZE ], x, searchKey, element; for ( x = 0; x <= SIZE - 1; x++ ) /* create data */ a[x] = 2 * x; printf( "Enter integer search key:\n" ); scanf( "%d", &searchKey ); element = linearSearch(a, searchKey, SIZE ); if ( element != -1 ) printf("Found value in element %d\n", element); else printf( "Value not found\n" ); return 0; }

12 Continua int linearSearch(const int array[], int key, int size) { int n; for ( n = 0; n <= size - 1; ++n ) if ( array[ n ] == key ) return n; return -1; } Enter integer search key: 36 Found value in element 18 Enter integer search key: 37 Value not found

13 6.8 Ricerca in un Vettore: Ricerca Lineare e Ricerca Binaria (II) Ricerca binaria –Si usa in vettori ordinati –Confronta lelemento di mezzo middle con la chiave di ricerca Se uguale, elemento trovato match found Se chiave < elemento di mezzo, cerca nella prima metà del vettore chiave > elemento di mezzo, cerca nellaltra metà del vettore Ripeti –Molto veloce; al più n steps, con 2 > numero di elementi Per un vettore di 30 elementi al più 5 steps 2 > 30 n 5

14 Binary search of an array #include #define SIZE 15 int binarySearch( const int [], int, int, int ); void printHeader( void ); void printRow( const int [], int, int, int ); int main() { int a[ SIZE ], i, key, result; for ( i = 0; i <= SIZE - 1; i++ ) a[ i ] = 2 * i; printf( "Enter a number between 0 and 28: " ); scanf( "%d", &key ); printHeader(); result = binarySearch( a, key, 0, SIZE - 1 ); if ( result != -1 ) printf("\n%d found in array element %d\n",key,result); else printf( "\n%d not found\n", key ); return 0; }

15 int binarySearch(const int b[], int searchKey,int low, int high) { int middle; while ( low <= high ) { middle = ( low + high ) / 2; printRow( b, low, middle, high ); if ( searchKey == b[ middle ] ) return middle; else if ( searchKey < b[ middle ] ) high = middle - 1; else low = middle + 1; } return -1; /* searchKey not found */ } Binary search of an array

16 Continua 53 /* Print a header for the output */ 54 void printHeader( void ) 55 { 56 int i; printf( "\nSubscripts:\n" ); for ( i = 0; i <= SIZE - 1; i++ ) 61 printf( "%3d ", i ); printf( "\n" ); for ( i = 1; i <= 4 * SIZE; i++ ) 66 printf( "-" ); printf( "\n" ); 69 }

18 Enter a number between 0 and 28: 25 Subscripts: * * * 28 24* 25 not found

19 6.9Vettori Multidimensionali Vettori con più indici –Tabelle con righe e colonne (array m x n) –Come le matrici: indicata la riga, si sceglie la colonna riga 0 riga 1 riga 2 colonna 0colonna 1colonna 2colonna 3 a[0][0] a[1][0] a[2][0] a[0][1] a[1][1] a[2][1] a[0][2] a[1][2] a[2][2] a[0][3] a[1][3] a[2][3] Indice riga nome Array Indice Colonna

20 6.9 Vettori Multidimensionali (II) inizializzazione int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; –Inizializzatori raggruppati per righe in parentesi –Se non sono abbastanza, si riempe (indeterminatamente) a zero int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; Referenziamento –Specificare riga e poi la colonna printf( "%d", b[ 0 ][ 1 ] );

21 Outline 1. inizializzazione variabili 1.1 definizione di funzioni che ricevono come argomento un vettore bidimensionale 1.2 inizializza studentgrades[][] 2. Chiama le funzioni minimum, maximum, e average 1/* Fig. 6.22: fig06_22.c 2 Double-subscripted array example */ 3#include 4#define STUDENTS 3 5#define EXAMS 4 6 7int minimum( const int [][ EXAMS ], int, int ); 8int maximum( const int [][ EXAMS ], int, int ); 9double average( const int [], int ); 10void printArray( const int [][ EXAMS ], int, int ); 11 12int main() 13{ 14 int student; 15 const int studentGrades[ STUDENTS ][ EXAMS ] = 16 { { 77, 68, 86, 73 }, 17 { 96, 87, 89, 78 }, 18 { 70, 90, 86, 81 } }; printf( "The array is:\n" ); 21 printArray( studentGrades, STUDENTS, EXAMS ); 22 printf( "\n\nLowest grade: %d\nHighest grade: %d\n", 23 minimum( studentGrades, STUDENTS, EXAMS ), 24 maximum( studentGrades, STUDENTS, EXAMS ) ); for ( student = 0; student <= STUDENTS - 1; student++ ) 27 printf( "The average grade for student %d is %.2f\n", 28 student, 29 average( studentGrades[ student ], EXAMS ) ); return 0; 32} Ogni riga è uno studente, ogni colonna è il voto ad un esame

22 Outline 3. Definisci le funzioni 33 34/* Find the minimum grade */ 35int minimum( const int grades[][ EXAMS ], 36 int pupils, int tests ) 37{ 38 int i, j, lowGrade = 100; for ( i = 0; i <= pupils - 1; i++ ) 41 for ( j = 0; j <= tests - 1; j++ ) 42 if ( grades[ i ][ j ] < lowGrade ) 43 lowGrade = grades[ i ][ j ]; return lowGrade; 46} 47 48/* Find the maximum grade */ 49int maximum( const int grades[][ EXAMS ], 50 int pupils, int tests ) 51{ 52 int i, j, highGrade = 0; for ( i = 0; i <= pupils - 1; i++ ) 55 for ( j = 0; j <= tests - 1; j++ ) 56 if ( grades[ i ][ j ] > highGrade ) 57 highGrade = grades[ i ][ j ]; return highGrade; 60} 61 62/* Determine the average grade for a particular exam */ 63double average( const int setOfGrades[], int tests ) 64{

23 Outline 3. Definisci le funzioni 65 int i, total = 0; for ( i = 0; i <= tests - 1; i++ ) 68 total += setOfGrades[ i ]; return ( double ) total / tests; 71} 72 73/* Print the array */ 74void printArray( const int grades[][ EXAMS ], 75 int pupils, int tests ) 76{ 77 int i, j; printf( " [0] [1] [2] [3]" ); for ( i = 0; i <= pupils - 1; i++ ) { 82 printf( "\nstudentGrades[%d] ", i ); for ( j = 0; j <= tests - 1; j++ ) 85 printf( "%-5d", grades[ i ][ j ] ); 86 } 87}

24 Outline Program Output The array is: [0] [1] [2] [3] studentGrades[0] studentGrades[1] studentGrades[2] Lowest grade: 68 Highest grade: 96 The average grade for student 0 is The average grade for student 1 is The average grade for student 2 is 81.75


Scaricare ppt "6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità"

Presentazioni simili


Annunci Google