Array in Fortran 90 (seconda parte)

annuncio pubblicitario
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
Scarica