Algoritmi di ordinamento di un vettore
Ordinare un vettore significa ridisporre i suoi elementi in modo tale che siano ordinati tra di loro (l’ordinamento più comune è per valore crescente) 5 33 23 17 6 9 81 3 j i Confronto a due a due tutte le coppie del vettore e,se non sono ordinate tra loro, le scambio.
function Vordinato = ordinamento (V) len=length(V); for i=1:len-1 Ordinare un vettore significa ridisporre i suoi elementi in modo tale che siano ordinati tra di loro (l’ordinamento più comune è per valore crescente) function Vordinato = ordinamento (V) len=length(V); for i=1:len-1 for j=i+1:len if V(i)>V(j) temp=V(i); V(i)=V(j); V(j)=temp; end Vordinato=V; X=uint32(rand(1,50)*100); Ordinamento(X);
SELECTION SORT INSERTION SORT Algoritmi “incrementali” Estende progressivamente una sottosequenza ordinata finchè tutto il vettore diventa ordinato BUBBLE SORT Si basa su più “scansioni” del vettore Scambia elementi vicini finchè tutto il vettore è ordinato
SELECTION SORT SELECTION SORT 9 8 9 8 1 2 3 4 5 6 7 9 8 1 2 3 4 5 6 7 9 8 Supponiamo che i primi k elementi del vettore siano ordinato, Es k=3 Come possiamo estendere l’ordinamento all’ elemento k+1 ? Selection sort: prendi il minimo tra gli n-k elementi rimanenti e spostalo nella posizione k+1 (con uno scambio)
SELECTION SORT 9 8 n = lunghezza del vettore, k all’inizio vale 1 2 3 4 5 6 7 9 8 n = lunghezza del vettore, k all’inizio vale 1 1.Prendi l’elemento in posizione k dove k-1 è il numero di elementi già ordinati 2.Trova il minimo tra gli n-k+1 elementi non ordinati 3.Scambia l’elemento in posizione k col minimo trovato 4. Aumenta k di 1 5.Se k < n torna al passo 1 Fine
7 7 7 7 7 7 Come funziona l’algoritmo SELECTION SORT: k=1 k=2 k=3 k=4 5 6 7 k=1 1 2 3 4 5 6 7 k=2 1 2 3 4 5 6 7 k=3 1 2 3 4 5 6 7 k=4 1 2 3 4 5 6 7 k=5 1 2 3 4 5 6 7 k=6
1 If m~=i
Esercizio: Modificare il codice in modo da visualizzare il numero di confronti e il numero di scambi effettuati
INSERTION SORT 1 2 3 4 5 6 7 9 8 1 2 3 4 5 6 7 9 8 Supponiamo che i primi k elementi del vettore siano ordinati, Es k=4 Come possiamo estendere l’ordinamento all’ elemento k+1 ? Selection sort: prendi l’elemento in posizione k+1 ed inseriscilo nella posizione corretta rispetto ai primi k elementi
INSERTION SORT 9 8 9 8 n = lunghezza del vettore, k all’inizio vale 2 1 2 3 4 5 6 7 9 8 1 2 3 4 5 6 7 9 8 n = lunghezza del vettore, k all’inizio vale 2 1.Prendi l’elemento in posizione k nel vettore 2.Trova la posizione per l’elemento k nella sottosequenza ordinata 3.Se la posizione per l’elemento k è minore di k, allora bisogna scalare alcuni elementi già ordinati 4. Aumenta k di 1 4.Se k < n torna al passo 1 Fine
7 7 7 7 7 7 Come funziona l’algoritmo INSERTION SORT: k=2 k=3 k=4 k=5 1 2 3 4 5 6 7 k=2 1 2 3 4 5 6 7 k=3 1 2 3 4 5 6 7 k=4 1 2 3 4 5 6 7 k=5 1 2 3 4 5 6 7 k=6 1 2 3 4 5 6 7 k=7
1 2 3 4 5 6 7 9 8
Esercizio: Modificare il codice in modo da visualizzare il numero di confronti e il numero di scambi effettuati
BUBBLE SORT 10 12 Si basa su più scansioni (scorrimenti) del vettore Durante ciascuno scorrimento, coppie di valori adiacenti non ordinate vengono scambiate Se durante una scansione non avviene nessuno scambio, il vettore è ordinato 1 2 3 4 5 6 7 10 12
Esercizio: Modificare il codice in modo da visualizzare il numero di confronti e il numero di scambi effettuati
ORDINAMENTO Modificare i tre algoritmi per l’ordinamento in modo da ordinare un vettore di 10 elementi in base al valore crescente dell’unità(cioè dell’ultima cifra a destra).
Esercizio: Atleta Lunedi Martedi Domenica 9 12 4 6.2 6.05 6.4 Realizza un programma in MatLab che consente di creare un report degli allenamenti di un atleta del salto in lungo. L’atleta si allena tutti i giorni provando a saltare ad una distanza di 6 metri, segnando le misure dei salti e ripetendo il salto finché questo riesce. Il report deve contenere Per ogni giorno della settimana: il giorno, il numero di salti e la distanza massima saltata. Lunedi Martedi Domenica 9 12 4 6.2 6.05 6.4
Esercizio: Atleta giorni={'Lunedi','Martedi','Mercoledi','Giovedi','Venerdi','Sabato','Domenica'}; numeroGiorni=length(giorni); allenamento={}; for i=1:numeroGiorni misuraSalto=0; numeroSalti=0; disp(giorni{i}); while misuraSalto<6 misuraSalto=input('Inserisci la misura del salto: '); numeroSalti=numeroSalti+1; end allenamento{i}={giorni{i} numeroSalti misuraSalto}; allenamento
giorni={'Lunedi','Martedi','Mercoledi','Giovedi','Venerdi','Sabato','Domenica'}; numeroGiorni=length(giorni); allenamento={}; for i=1:numeroGiorni vettoreMisure=[]; misuraSalto=0; numeroSalti=0; disp(giorni{i}); while misuraSalto<6 misuraSalto=input('Inserisci la misura del salto: '); vettoreMisure=[vettoreMisure misuraSalto]; end allenamento{i}={giorni{i} length(vettoreMisure) vettoreMisure}; allenamento migliori={}; migliorSalto=max(allenamento{i}{3}); allenamento{i}{3}=migliorSalto;
Esercizi: CON FUNZIONI PREDEFINITE E INDICIZZAZIONE MATLAB Generare un vettore di numeri casuali compresi tra 0 e 99; Contare quanti elementi sono maggiori del primo; Trovare la posizione del primo valore superiore al primo; Trovare la posizione dell’ultimo valore superiore al primo Generare un vettore di numeri casuali compresi tra -50 e 49; Contare quanti elementi sono maggiori della somma di tutti gli elementi; sostituire con 0 tali valori. CALCOLO DEL MINIMO Dato un vettore di 10 elementi, sostituire l’elemento con valore minimo con il valore della posizione che occupa. CALCOLO DEL MINIMO,MASSIMO E SCAMBIO - Dato un vettore di 10 elementi (riempito con valori random) scrivi un procedimento per scambiare di posto il valore minimo col valore massimo.
Generare un vettore di numeri casuali compresi tra 0 e 99; Contare quanti elementi sono maggiori del primo; Trovare la posizione del primo valore superiore al primo; Trovare la posizione dell’ultimo valore superiore al primo Generare un vettore di numeri casuali compresi tra -50 e 49; Contare quanti elementi sono maggiori della somma di tutti gli elementi; sostituire con 0 tali valori. SOLUZIONI ESERCIZI CON FUNZIONI PREDEFINITE E INDICIZZAZIONE V=floor(100*rand(1,10)) sum(V>V(1)) min(find(V>V(1))) max(find(V>V(1))) V=floor(-50+100*rand(1,10)) sum(V>sum(V)) V(find(V>sum(V)))=0
Dato un vettore di 10 elementi, sostituire l’elemento con valore minimo con il valore della posizione che occupa. SOLUZIONE ESERCIZI SUL CALCOLO DEL MINIMO V = floor(50*rand(1,10)); disp(V); pos=1; for i=1:length(V) if V(i)<V(pos) pos=i; end V(pos)=pos;
Esercizio: Generare una matrice 5x5 contenente zeri. Generare un vettore di 5 elementi random compresi tra 0 e 49 Riempire le righe della matrice con il contenuto del vettore: in ciascuna riga il contenuto del vettore sarà «ruotato» di 0,1,2,3 e 4 posizioni verso sinistra 34 6 12 11 40 34 6 12 11 40