Corso di INFORMATICA - Ingegneria Aerospaziale Array in Fortran 90 (seconda parte) Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2007/2008 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 1 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Cosa vedremo in questa lezione 1 Operazioni globali su array 2 Sezioni di array 3 Funzioni su array 4 Uso degli array come parametri dei sottoprogrammi 5 Matrici 6 Ciclo DO implicito 7 Ordinamento di un vettore Fortran 90: array DIS - Dipartimento di informatica e sistemistica 2 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Operazioni globali su array Operazioni globali su array È possibile inizializzare un array utilizzando un altro array, purché entrambi abbiano la stessa forma INTEGER , DIMENSION ( 3 ) ..... array1 = array2 : : array1 , array2 Le operazioni aritmetiche possono essere applicate agli array, purché tutti gli array abbiano la stessa forma INTEGER , DIMENSION ( 3 ) : : r i s INTEGER , DIMENSION( − 1 : 1 ) : : v e t 1 INTEGER , DIMENSION( 1 0 0 , 1 0 2 ) : : v e t 2 ... r i s = vet1 + vet2 r i s = vet1 − vet2 r i s = vet1 ∗ vet2 r i s = vet1 / vet2 r i s = v e t 1 ∗∗ v e t 2 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 3 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Operazioni globali su array Significato delle operazioni globali su array Le operazioni vengono effettuate elemento per elemento Ad esempio, il risultato di vet1 + vet2 è un array avente ogni elemento pari alla somma dei rispettivi elementi di vet1 e vet2: vet1 1 6 -1 vet2 2 -4 -7 ris 3 2 -8 Di conseguenza, ‘*’ applicato agli array non è né prodotto scalare, né prodotto vettoriale. Tuttavia esiste la funzione predefinita per il prodotto scalare: WRITE( ∗ , ∗ ) ’ P r o d o t t o s c a l a r e = ’ , DOT PRODUCT( v e t 1 , v e t 2 ) Non esiste funzione predefinita per il prodotto vettoriale Fortran 90: array DIS - Dipartimento di informatica e sistemistica 4 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Operazioni globali su array Operazioni globali con scalari Gli scalari sono considerati conformi, ossia aventi stessa forma, rispetto qualsiasi array È quindi sempre possibile effettuare operazioni tra array e scalari Anche le operazioni globali con scalari vengono effettuate elemento per elemento Assegnazione: r i s = 1000 ! G ià v i s t o i n p r e c e d e n z a Inizializzazione: INTEGER , DIMENSION ( 3 ) :: r i s 2 = −98765 ! G ià v i s t o Operazioni aritmetiche con un operando scalare: r i s = v e t t ∗ 1000 r i s = 1000 ∗ v e t 2 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 5 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Sezioni di array Sezioni di array INTEGER , DIMENSION ( 3 ) : : v e t 1 INTEGER , DIMENSION ( 3 0 1 : 3 0 3 ) : : v e t 2 INTEGER , DIMENSION( 1 0 ) : : v e t 3 È possibile definire “sezioni” di array Ad esempio, vet3(6:8) è una “sezione” di array Una sezione dell’array V usa la stessa memoria di V. vet3 non ha la stessa forma di vet1 e vet2. vet3(6:8) ha la stessa forma di vet1 e vet2. Pertanto sono possibili le operazioni: vet2 = vet3 (6:8) vet3 (6:8) = vet1 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 6 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Sezioni di array Vari modi per denotare una sezione di array Mediante espressioni: i = 2 vet3 ( i :2∗ i ) = vet1 ! a s s e g n a SOLO a l l e l o c a z i o n i vet3 (2) , vet3 (3) , vet3 (4) Mediante un passo con la sintassi nome vettore(low:up:passo) Se manca low, low = indice inferiore dell’array Se manca up, up = indice superiore dell’array Se manca passo, passo è impostato a uno Esempi: vet3 ( 2 : 6 : 2 ) = vet1 ! a s s e g n a SOLO a l l e l o c a z i o n i v e t 3 ( 2 ) , v e t 3 ( 4 ) , v e t 3 ( 6 ) vet3 ( : 5 ) ! i l sottoinsieme vet (1) , vet ( 2 ) , . . . , vet (5) vet3 ( 2 : 4 : ) ! i l sottoinsieme vet (2) , a (3) , a (4) vet3 ( 5 : : 2 ) ! i l sottoinsieme vet (5) , vet (7) , vet (9) Mediante “indice vettoriale”: vet5 ( (/ 8 , 9 , 2 /) ) = vet1 ! a s s e g n a SOLO a l l e l o c a z i o n i v e t 5 ( 8 ) , v e t 5 ( 9 ) , v e t 5 ( 2 ) Fortran 90: array DIS - Dipartimento di informatica e sistemistica 7 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Funzioni su array Funzioni predefinite Possiamo usare, anche componendole, moltissime funzioni già viste per gli scalari (vedi appendice A del libro per elenco completo) r i s = INT ( LOG10 (REAL( v e t 1 ) ) ) Importanti funzioni predefinite: LBOUND(vett,dim), UBOUND(vett,dim): INTEGER , DIMENSION ( 3 0 1 : 3 0 3 ) : : v e t 3 WRITE( ∗ , ∗ ) LBOUND( v e t 3 , 1 ) , UBOUND( v e t 3 , 1 ) ! stampa 301 303 L’uso di operatori relazionali fra array non è ammesso. I F ( v e t 1 == v e t 2 ) ... ! SINTATTICAMENTE SCORRETTO Per verificare l’uguaglianza dobbiamo confrontare un elemento per volta Fortran 90: array DIS - Dipartimento di informatica e sistemistica 8 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Funzioni su array Stampa e lettura di array Abbiamo visto che è possibile stampare/leggere un singolo elemento dell’array: INTEGER , DIMENSION ( 3 ) ... WRITE( ∗ , ∗ ) v e t 1 ( 3 ) ... DO i = 1 , 3 READ ( ∗ , ∗ ) v e t 1 ( i ) END DO :: vett1 È anche possibile stampare/leggere: tutto l’array: ! l e g g e 3 i n t e r i , s e p a r a t i da RETURN o p p u r e no READ ( ∗ , ∗ ) v e t 1 ! stampa s u una r i g a , i n m a n i e r a non f o r m a t t a t a WRITE( ∗ , ∗ ) v e t 1 una sua sezione: READ ( ∗ , ∗ ) v e t 1 ( 1 : 2 ) WRITE( ∗ , ∗ ) v e t 1 ( 2 : 3 ) Fortran 90: array DIS - Dipartimento di informatica e sistemistica 9 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Funzioni su array Confronto tra vettori e stringhe Le stringhe sono “vettori di caratteri”, con alcune differenze: 1. È possibile confrontare stringhe usando gli operatori relazionali (‘==’, ‘/=’, ‘>’, ‘ >=’, ‘<’, ‘<=’ ) 2. La sintassi e la semantica dell’assegnazione sono diverse: CHARACTER( 1 0 ) : : c o r t a 1 = ’ 1 2 3 4 5 6 7 8 9 0 ’ , c o r t a 2 = ’ 0 9 8 7 6 5 4 3 2 1 ’ CHARACTER( 1 5 ) : : l u n g a = ’ABCDEFGHIJKLMNO ’ ... ! a s s e g n a z i o n e permessa anche se l e e s t e n s i o n i sono d i v e r s e corta1 = lunga ! i g n o r a i c a r a t t e r i i n piu ’ lunga = corta2 ! s p a z i a l posto d e i c a r a t t e r i mancanti 3. Le “sezioni di stringhe” sono solamente contigue: corta1 (5:9) corta1 (1:10:2) c o r t a 1 ( (/ 8 , 9 , 2 /) ) Fortran 90: array ! OK ! NON AMMESSO ! NON AMMESSO DIS - Dipartimento di informatica e sistemistica 10 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Uso degli array come parametri dei sottoprogrammi Passaggio parametri array È possibile utilizzare gli array come parametri di procedure e funzioni. Abbiamo visto che il Fortran 90 utilizza lo schema di passaggio dei parametri per riferimento. Quindi possiamo passare solo il puntatore alla locazione di memoria contenente il primo elemento! Tre modalità consentite: Array fittizi di forma esplicita Si devono passare come parametri le estensioni di ogni dimensione Array fittizi di forma presunta Si dichiara solo il rango Array fittizi di forma presunta senza dichiarazione del rango (obsoleti) Si usa un “*” senza dichiarare né rango né estesensioni Fortran 90: array DIS - Dipartimento di informatica e sistemistica 11 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Uso degli array come parametri dei sottoprogrammi Parametri di tipo array di forma presunta Per utilizzare un array fittizio di forma presunta: 1. deve essere dichiarato il tipo degli elementi, 2. deve essere dichiarato il numero di dimensioni, 3. non deve essere dichiarato il numero di elementi per ogni dimensione (estensione). Inoltre, come per tutti gli argomenti, va dichiarato l’INTENT Per conoscere l’estensione di una dimensione si possono utilizzare le funzioni intrinseche: LBOUND(array, dim): estremo inferiore della dimensione dim UBOUND(array, dim): estremo superiore della dimensione dim Fortran 90: array DIS - Dipartimento di informatica e sistemistica 12 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Uso degli array come parametri dei sottoprogrammi Esempi di sottoprogrammi con parametri array Subroutine per la lettura di un array di interi (array fittizio di forma presunta senza dichiarazione del rango): SUBROUTINE l e g g i v e t t o r e ( v e t ) INTEGER , INTENT(OUT) , DIMENSION ( ∗ ) ! i l v e t t o r e da l e g g e r e :: vet Subroutine per la stampa di un array di interi di rango 2 e di lunghezza arbitraria: (array fittizio di forma presunta) SUBROUTINE s t a m p a v e t t o r e ( v e t ) INTEGER , DIMENSION ( : , : ) , INTENT( IN ) : : ! i l v e t t o r e da s t a m p a r e Fortran 90: array vet DIS - Dipartimento di informatica e sistemistica 13 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Uso degli array come parametri dei sottoprogrammi Esempi di parametri array (cont.) Funzione per la somma vettoriale di due array di interi di rango 1 e di lunghezza arbitraria (passata come parametro: array fittizio di forma esplicita): FUNCTION s o m m a v e t t o r i ( v e t 1 , v e t 2 , dim ) ! ∗∗ DICHIARAZIONE ARGOMENTI F I T T I Z I INTEGER , DIMENSION( dim ) , INTENT( IN ) : : v e t 1 , v e t 2 ! i v e t t o r i di input INTEGER , INTENT( IN ) : : dim ! la lunghezza dei v e t t o r i ! ∗∗ DICHIARAZIONE TIPO FUNZIONE INTEGER , DIMENSION( dim ) : : s o m m a v e t t o r i Subroutine per la somma vettoriale di due vettori di interi di lunghezza arbitraria. Analoga alla precedente, ma non è necessario passare la lunghezza. SUBROUTINE s o m m a v e t t o r i s u b ( v e t 1 , v e t 2 , r i s ) INTEGER , DIMENSION ( : ) , INTENT( IN ) : : v e t 1 , v e t 2 ! i v e t t o r i di input INTEGER , DIMENSION ( : ) , INTENT(OUT) : : r i s ! i l v e t t o r e di output Fortran 90: array DIS - Dipartimento di informatica e sistemistica 14 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Uso degli array come parametri dei sottoprogrammi Passaggio di stringhe come parametri La gestione dei parametri di tipo carattere è molto simile a quella degli array! Viene utilizzata la dichiarazione in forma presunta Senza dichiarazione del rango (sempre 1) Esempio: SUBROUTINE s t a m p a l u n g h e z z a ( s t r i n g a ) CHARACTER( l e n =∗) , INTENT( IN ) : : s t r i n g a WRITE ( ∗ , ∗ ) ” L u n g h e z z a= ” , LEN( s t r i n g a ) RETURN END SUBROUTINE s t a m p a l u n g h e z z a Fortran 90: array DIS - Dipartimento di informatica e sistemistica 15 / 32 Matrici Corso di INFORMATICA - Ingegneria Aerospaziale Array bidimensionali (matrici) Sono utili quando serve strutturare i dati in forma non lineare Esempio: temperatura in tre diverse ore (8,9,10) del giorno per ognuno dei sette giorni di una settimana Serve una matrice con 7 righe e 3 colonne: REAL , DIMENSION ( 7 , 8 : 1 0 ) 1 2 3 4 5 6 7 :: temperature | 8 | 9 | 10 | +-----+-----+-----+ | 1.0 | 8.0 |15.0 | | 2.0 | 9.0 |16.0 | | 3.0 |10.0 |17.0 | | 4.0 |11.0 |18.0 | | 5.0 |12.0 |19.0 | | 6.0 |13.0 |20.0 | | 7.0 |14.0 |21.0 | +-----+-----+-----+ Esercizio: scrivere un frammento di codice che assegna alla matrice esattamente questi valori Fortran 90: array DIS - Dipartimento di informatica e sistemistica 16 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Matrici Soluzione esercizio Soluzione: INTEGER : : r , c ! c o n t a t o r i per i ... DO r = 1 , 7 DO c = 8 , 10 t e m p e r a t u r e ( r , c ) = r + 7 ∗ ( c −8) END DO END DO cicli Soluzione alternativa: DO r = LBOUND( t e m p e r a t u r e , 1 ) , UBOUND( t e m p e r a t u r e , 1 ) DO c = LBOUND( t e m p e r a t u r e , 2 ) , UBOUND( t e m p e r a t u r e , 2 ) t e m p e r a t u r e ( r , c ) = r + 7 ∗ ( c −8) END DO END DO Fortran 90: array DIS - Dipartimento di informatica e sistemistica 17 / 32 Matrici Corso di INFORMATICA - Ingegneria Aerospaziale Ancora sulle matrici Esistono molte funzioni predefinite sulle matrici “interessanti”, ad esempio MATMUL. Per un elenco completo, vedere l’appendice A del libro. Esercizio: data una matrice, verificare se è simmetrica oppure no. Esempio: 2 4 5 9 Fortran 90: array 4 1 3 2 5 3 8 6 9 2 6 7 DIS - Dipartimento di informatica e sistemistica 18 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Matrici Matrice simmetrica 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 MODULE o p e r a z i o n i s u m a t r i c i CONTAINS SUBROUTINE l e g g i m a t r i c e ( mat ) ...... SUBROUTINE s t a m p a m a t r i c e ( mat ) ...... FUNCTION s i m m e t r i c a ( mat ) ! ∗∗∗ SEZIONE DICHIARATIVA IMPLICIT NONE ! ∗∗ DICHIARAZIONE ARGOMENTI F I T T I Z I INTEGER , INTENT( IN ) , DIMENSION ( : , : ) : : mat ! ∗∗ DICHIARAZIONE TIPO FUNZIONE LOGICAL : : s i m m e t r i c a ! ∗∗ DICHIARAZIONE VARIABILI LOCALI INTEGER : : i , j ! la matrice di input ! i n d i c i dei c i c l i per scandire ! l e componenti d e l l a m at ri c e ! ∗∗∗ SEZIONE ESECUTIVA ! NOTA: c o n s i d e r a n d o s o l a m e n t e g l i e l e m e n t i d e l l a m a t r i c e a l d i s o p r a d e l l a ! d i a g o n a l e p r i n c i p a l e , s e s e ne t r o v a uno c h e e ’ d i v e r s o d a l ! s i m m e t r i c o , a l l o r a l a m a t r i c e e ’ s i c u r a m e n t e non s i m m e t r i c a s i m m e t r i c a = . TRUE . DO i = LBOUND( mat , 1 ) , UBOUND( mat , 1 ) DO j = i +1 , UBOUND( mat , 2 ) I F ( mat ( i , j ) /= mat ( j , i ) ) s i m m e t r i c a = . FALSE . END DO END DO RETURN END FUNCTION s i m m e t r i c a END MODULE o p e r a z i o n i s u m a t r i c i Fortran 90: array DIS - Dipartimento di informatica e sistemistica 19 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Matrici Sezioni di array bidimensionali Oltre a quelle già viste per gli array monodimensionali, sono possibili altre maniere di “sezionare” un array bidimensionale REAL , DIMENSION ( 7 ) : : REAL , DIMENSION ( 8 : 1 0 ) : : REAL , DIMENSION ( 6 : 7 , 8 : 1 0 ) ! s a b a t o e domenica ... temperature delle nove = temperature del venerdi = temperature del weekend = Fortran 90: array :: temperature delle nove temperature del venerdi temperature del weekend temperature (: ,9) temperature (5 ,:) temperature ( 6 : 7 , : ) DIS - Dipartimento di informatica e sistemistica 20 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ciclo DO implicito Stampa/lettura (non formattata) di matrici WRITE ( ∗ , ∗ ) ’TEMPERATURE = ’ , temperature WRITE ( ∗ , ∗ ) ’T . DELLE NOVE = ’ , temperature delle nove WRITE ( ∗ , ∗ ) ’T . DEL VENERDI ’ ’ = ’ , temperature del venerdi WRITE ( ∗ , ∗ ) ’T . DEL WEEKEND’ ’ = ’ , temperature del weekend ! LA STAMPA AVVIENE SEMPRE PER COLONNE ! ( perche ‘ l e m a t r i c i sono memorizzate c o s i ’ ) TEMPERATURE = 5.00000 10.0000 15.0000 20.0000 T. DELLE NOVE = 12.0000 T. DEL VENERDI’ T. DEL WEEKEND’ 20.0000 1.00000 2.00000 3.00000 4.00000 6.00000 7.00000 8.00000 9.00000 11.0000 12.0000 13.0000 14.0000 16.0000 17.0000 18.0000 19.0000 21.0000 8.00000 9.00000 10.0000 11.0000 13.0000 14.0000 = 5.00000 12.0000 19.0000 = 6.00000 7.00000 13.0000 14.0000 21.0000 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 21 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ciclo DO implicito Stampa per righe di una matrice Se vogliamo stampare per righe la matrice, possiamo usare il “DO implicito” WRITE(*,*) ’STAMPA PER RIGHE DELLE TEMPERATURE = ’ DO r = 1, 7 WRITE(*,*) (temperature(r,c), & & c = LBOUND(temperature,2), UBOUND(temperature,2)) END DO STAMPA PER RIGHE DELLE TEMPERATURE = 1.00000 8.00000 15.0000 2.00000 9.00000 16.0000 3.00000 10.0000 17.0000 4.00000 11.0000 18.0000 5.00000 12.0000 19.0000 6.00000 13.0000 20.0000 7.00000 14.0000 21.0000 Fortran 90: array DIS - Dipartimento di informatica e sistemistica 22 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ciclo DO implicito Il DO implicito Sintassi: ( arg1 , [arg2 , . . . ,] indice = inizio, fine [,incremento] ) Il “DO implicito” non è un’istruzione ma un’espressione e serve tipicamente per: 1. Stampa/lettura su una stessa riga. 2. Denotare espressioni complesse di array. Non va usato come valore sinistro di un’assegnazione Fortran 90: array DIS - Dipartimento di informatica e sistemistica 23 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ciclo DO implicito Il DO implicito: esempi Esempi del tipo 1 INTEGER : : i ! contatore ... WRITE( ∗ , ∗ ) ’QUADRATI ’ WRITE( ∗ , ∗ ) ( ’ n : ’ , i , ’ , ’ , ’ n ˆ 2 : ’ , i ∗ ∗ 2 , ’. ’ , i = 1 , 5) Cosa viene stampato: QUADRATI n: n^2: 4. n: n: 4, n^2: Fortran 90: array 1, n^2: 3, n^2: 16. n: 1. n: 9. 5, n^2: DIS - Dipartimento di informatica e sistemistica 2, 25. 24 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ciclo DO implicito Il DO implicito: esempi del tipo 2 Dichiarazione di un vettore: INTEGER : : i ! contatore INTEGER , DIMENSION( 1 0 ) : : v e t 5 = ( / ( i , i = 1 , 1 0 ) / ) ! equivalente a ! v e t 5 = ( / 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 / ) Assegnazione ad un vettore: vet5 = (/ ( i ∗2 , i = 1 , 10) /) ! equivalente a ! v e t 5 = ( / 2 , 4 , 6 , 8 , 1 0 , 1 2 , 1 4 , 1 6 , 1 8 , 20 / ) Fortran 90: array DIS - Dipartimento di informatica e sistemistica 25 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Problema dell’ordinamento di un vettore Definizione del problema Scrivere una subroutine che consenta di ordinare in senso crescente un array di interi di rango uno e dimensione qualsiasi Dati di input ed output Dati in input: vettore di interi Dati in output: vettore di interi ordinato in senso crescente Algoritmo Vedremo due algoritmi: Algoritmo di ordinamento per selezione Algoritmo di ordinamento a bolle Fortran 90: array DIS - Dipartimento di informatica e sistemistica 26 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Algoritmo di ordinamento per selezione Meccanismo Trovo il più piccolo elemento del vettore e lo scambio con l’elemento in prima posizione Trovo il più piccolo elemento tra quelli dalla posizione 2 fino alla fine del vettore e lo scambio con l’elemento in seconda posizione Applico lo stesso ragionamento fino al penultimo elemento del vettore Fortran 90: array DIS - Dipartimento di informatica e sistemistica 27 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Pseudocodice e diagramma di flusso Pseudocodice 1. PER i che va da 1 a numero valori-1 2. minimo = i 3. PER j che va da i+1 a numero valori 3.1 SE elemento(j) < elemento(minimo) minimo = j FINE CICLO 4. SE minimo /= i ALLORA 4.1 temp = elemento(i) elemento(i) = elemento(minimo) elemento(minimo) = temp FINE CICLO Diagramma di flusso Fortran 90: array DIS - Dipartimento di informatica e sistemistica 28 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Pseudocodice e diagramma di flusso Pseudocodice Diagramma di flusso Fortran 90: array DIS - Dipartimento di informatica e sistemistica 28 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Ordinamento a bolle Meccanismo L’ordinamento a bolle si basa sul principio che in un array ordinato, per gli elementi di indice i e i+1 vale sempre la relazione: elementi(i) <= elementi(i + 1) Supponiamo che la dimensione dell’array sia n: Confronto l’elemento di indice n con l’elemento di indice n-1. Se elementi(n) < elementi(n − 1) scambio i due valori Proseguo i confronti fino al primo elemento. Alla fine del ciclo in prima posizione ci sarà l’elemento più piccolo Ripeto lo stesso meccanismo fermando la “risalita” di volta in volta all’elemento successivo rispetto al ciclo precedente L’algoritmo termina quando durante un ciclo non effettuo nessuno scambio oppure quando ho applicato il meccanismo n-1 volte Fortran 90: array DIS - Dipartimento di informatica e sistemistica 29 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Ordinamento a bolle Meccanismo Fortran 90: array DIS - Dipartimento di informatica e sistemistica 29 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Pseudocodice algoritmo di ordinamento a bolle 1. 2. 3. 4. 5. i=1 CICLO i=i+1 fine = .TRUE. PER j che va da n a i con incremento = -1 5.1 SE elemento(j) < elemento(j-1) ALLORA 5.1.1 temp = elemento(j) elemento(j) = elemento(j-1) elemento(j-1) = temp fine = .FALSE. FINE CICLO 6. SE (i == n .OR. fine) EXIT FINE CICLO Fortran 90: array DIS - Dipartimento di informatica e sistemistica 30 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Complessità degli algoritmi degli algoritmi Supponiamo che l’operazione di confronto sia la più costosa nei nostri algoritmi Algoritmo di ordinamento per selezione, in tutti i casi: Prima iterazione: (n − 1) confronti, seconda iterazione: (n − 2) confronti, ecc. . . Costo: (n − 1) + (n − 2) + (n − 3) + . . . + 3 + 2 + 1 = n(n−1) 2 Algoritmo di ordinamento a bolle, nel caso peggiore (array ordinato in senso decrescente): Prima iterazione: (n-1) confronti, seconda iterazione: (n-2) confronti, ecc. . . Costo: (n − 1) + (n − 2) + (n − 3) + . . . + 3 + 2 + 1 = n(n−1) 2 Algoritmo di ordinamento a bolle, nel caso migliore (array ordinato in senso crescente): Prima iterazione: (n − 1) confronti, poi algoritmo termina Costo: (n − 1) Fortran 90: array DIS - Dipartimento di informatica e sistemistica 31 / 32 Corso di INFORMATICA - Ingegneria Aerospaziale Ordinamento di un vettore Considerazioni sull’efficienza Nel caso dell’algoritmo di ordinamento per selezione il costo è identico per qualsiasi array in input Algoritmo indipendente dai valori dei dati di ingresso Nel caso dell’algoritmo di ordinamento a bolle il costo dipende dai dati in ingresso Nel caso peggiore, stessa complessità dell’altro algoritmo Nel caso migliore, più efficiente In generale più efficiente! Secondo la teoria della complessità degli algoritmi entrambi hanno complessità O(n2 ) Il migliore algoritmo di ordinamento teorico ha complessità O(n log n) Fortran 90: array DIS - Dipartimento di informatica e sistemistica 32 / 32