La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi di ordinamento Calzetta Emilia Cervone Vincenzo Didattica della programmazione I Prof. Giulio Giunta Didattica della programmazione I Prof. Giulio.

Presentazioni simili


Presentazione sul tema: "Algoritmi di ordinamento Calzetta Emilia Cervone Vincenzo Didattica della programmazione I Prof. Giulio Giunta Didattica della programmazione I Prof. Giulio."— Transcript della presentazione:

1 Algoritmi di ordinamento Calzetta Emilia Cervone Vincenzo Didattica della programmazione I Prof. Giulio Giunta Didattica della programmazione I Prof. Giulio Giunta

2 ALGORITMI DI ORDINAMENTO Contenuti: Algoritmi di ordinamento iterativi e ricorsivi Ordinamento per inserimento: Insertion-sort Ordinamento per selezione del min/max: Selection-sort Ordinamento a bolle: Bubble-sort Analisi della complessità nel contare gli scambi e i confronti (caso peggiore) Analisi comparata Simulazioni in linguaggio VB Riferimenti: Cormen, Leiserson, Rivest- Introduzione agli algoritmi -McGrawHill

3 ALGORITMI DI ORDINAMENTO Classe:3^ I.T.I.S. Classe: 3^ I.T.I.S.Prerequisiti: Conoscenze sullorganizzazione dei dati mediante la struttura vettoriale Conoscenze della teoria della ricorsione e delliterazione Conoscenze della teoria e implementazione degli algoritmi Conoscenze del linguaggio Visual Basic e delle Macro di ExcelObiettivi: Saper gestire lorganizzazione e ordinamento dei dati in un vettore Capire limportanza dellordinamento dei dati Utilizzare le strutture di iterazione e ricorsione Analizzare le applicazioni relative agli argomenti teorici affrontati Modalità di lavoro: lezioni frontali utilizzo del laboratorio

4 ALGORITMI DI ORDINAMENTO 4 Ordinamento di una sequenza Una sequenza è un insieme di elementi omogenei tra loro. Ordinare una sequenza di elementi in ordine crescente (non-decrescente) significa disporre gli elementi in modo da averli in ordinati in base al loro valore dal più piccolo al più grande da sinistra a destra. sequenza iniziale (C,A,D,A,E,G,B,M,C) sequenzaordinata (A,A,B,C,C,D,E,G,M) sequenza ordinata (A,A,B,C,C,D,E,G,M) La sequenza ordinata contiene gli stessi elementi della sequenza iniziale e ogni elemento appare con la stessa molteplicità nelle due sequenze. Una sequenza (a 1,a 2,…,a n-1,a n ) è ordinata (sorted) se a 1 a 2 … a n-1 a n se e solo se il valore di a i è minore di quello di a i+1 oppure a i e a i+1 hanno lo stesso valore

5 ALGORITMI DI ORDINAMENTO 5 1, …,4 A = Vettore ordinato A[i] A[j] con i, j=1, …,4, i

6 ALGORITMI DI ORDINAMENTO 6 Un ordine perfetto è il fondamento di tutte le cose (Edmund Burke ) Laccesso a collezioni di dati ordinate in modo opportuno è più semplice che non laccesso a collezioni non ordinate. A che servirebbe un elenco telefonico se gli utenti fossero elencati in ordine sparso? Importanza dellordinamento (1) Anche nei calcolatori, è spesso utile gestire collezioni di dati ordinate secondo un qualche criterio di ordinamento, questo ad esempio permette di usare algoritmi di ricerca più efficienti (ricerca binaria)

7 ALGORITMI DI ORDINAMENTO 7 procedure r_bin(in:n,elenco,chiave; out:trovato,indice) var elenco: array(1..n) of character var chiave: character var n,indice,mediano,primo,ultimo: integer var trovato: logical begin primo:= 1; ultimo:= n; trovato:= false repeat mediano := (primo+ultimo)/2 if chiave = elenco(mediano) then trovato := true else if chiave < elenco(mediano) then ultimo := mediano - 1 else primo := mediano + 1 endif until trovato or primo = ultimo indice := mediano end procedure r_bin(in:n,elenco,chiave; out:trovato,indice) var elenco: array(1..n) of character var chiave: character var n,indice,mediano,primo,ultimo: integer var trovato: logical begin primo:= 1; ultimo:= n; trovato:= false repeat mediano := (primo+ultimo)/2 if chiave = elenco(mediano) then trovato := true else if chiave < elenco(mediano) then ultimo := mediano - 1 else primo := mediano + 1 endif until trovato or primo = ultimo indice := mediano end Importanza dellordinamento (2) La tecnica di ricerca binaria, rispetto alla ricerca esaustiva, consente di eliminare ad ogni passo metà degli elementi del vettore chiave = 11 mediano=(9+1)/2=5; elenco[5]= primo =1; ultimo=4 mediano := (primo+ultimo)/2 primo=1; ultimo=9; trovato=false primoultimo primo:= 1; ultimo:= n; trovato:= false mediano := (primo+ultimo)/2 if chiave < elenco(mediano) then ultimo := mediano - 1 if chiave < elenco(mediano) then ultimo := mediano - 1 primoultimo primo=1; ultimo=4; trovato=false mediano=(4+1)/2=2; elenco[2]=5 mediano := (primo+ultimo)/ >5 ---> primo= 2+1=3 else primo := mediano else primo := mediano + 1 primo=3; ultimo=4; trovato=false mediano=(3+4)/2=3; elenco[3]=11 Iterazione:1 Iterazione:2Iterazione:3 11 if chiave = elenco(mediano) then trovato := true if chiave = elenco(mediano) then trovato := true Elemento è stato trovato nella terza locazione dellarray: indice=3 indice := mediano trovato = true

8 ALGORITMI DI ORDINAMENTO 8 type studente : record cognome: character nome : character matricola : integer media : integer end var stud1,stud2,stud3,stud4,stud5: studente type studente : record cognome: character nome : character matricola : integer media : integer end var stud1,stud2,stud3,stud4,stud5: studente Il valore su cui si effettua lordinamento di un insieme di elementi si definisce chiave (key) di ordinamento. Nel caso si desideri ordinare insiemi di variabili con differenti tipi di valori (record o strutture) occorre definire bene la chiave dellordinamento. Chiave di ordinamento Esempio: Ordinamento per cognome e nome (Es. ordinamento alfabetico del registro di classe) Ordinamento per media (con valori ripetuti)

9 ALGORITMI DI ORDINAMENTO 9 Key1VerdiBianchiRussoBianchiEsposito Neri Key2MarioAntonioCarlo GianniLucaMarco Key Key Problema: Problema: ordinare in ordine crescente un insieme di studenti considerando le chiavi di ordinamento: Key1=cognome; Key2=nome; Key3=matricola; Key4=media scolastica; Key1=cognome; Key2=nome; Key3=matricola; Key4=media scolastica;Key1Russo Neri BianchiVerdiBianchi EspositoKey2Carlo MarcoGianniMarioAntonioLuca Key Key Ordinamento crescente per matricola

10 ALGORITMI DI ORDINAMENTO 10 Ordinamento crescente per media scolastica Key1EspositoVerdiRussoNeriBianchi Key2Luca MarioCarloMarcoGianniAntonio Key Key Key1VerdiBianchiRussoBianchiEsposito NeriKey2MarioAntonioCarlo GianniLucaMarco Key Key Key1BianchiBianchiEspositoNeriRussoVerdiKey2AntonioGianniLucaMarcoCarloMario Key Key Ordinamento crescente per cognome e nome

11 ALGORITMI DI ORDINAMENTO 11 Iterazione e ricorsione (1) Gli algoritmi di ordinamento possono essere iterativi e ricorsivi Iterazione: ripetere piu volte una sequenza di operazioni ( ( ( (1) + 2) +3)+…+ n) Esempio: somma i primi n interi: ( ( ( (1) + 2) +3)+…+ n) for (i=1, i<=n, i++) somma=somma +i La caratteristica fondamentale di un algoritmo ITERATIVO è che a ogni passo è disponibile un risultato parziale: dopo k passi, si ha a disposizione il risultato parziale relativo al caso k

12 ALGORITMI DI ORDINAMENTO 12 Gli algoritmi ricorsivi si basano sulla possibilità di definire una funzione in termini di se stessa. Una funzione è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa. Iterazione e ricorsione (2) Esempio: somma i primi n iteri S n = n + S n-1 = n+ (n-1) S n = n + S n-1 = n + somma dei primi (n-1) numeri interi Risolvere un problema con un approccio ricorsivo comporta di identificare un caso base la cui soluzione sia nota di riuscire a esprimere la soluzione al caso generico n in termini dello stesso problema in uno o più casi più semplici (n-1, n-2, etc).

13 ALGORITMI DI ORDINAMENTO 13 Esempio di funzione ricorsiva: somma dei primi (n-1) interi è una istanza più semplice del problema somma dei primi n interi e tale istanza può essere scomposta, a sua volta, in unistanza ancora più semplice S n = n + S n-1 somma dei primi n iteri n + soluzione del problema della somma dei primi (n-1) iteri Osserviamo che nella ricorsione, a differenza delliterazione, non si dispone di un risultato parziale finché non si è giunti fino allistanza elementare S n = n+(n-1)+S n-2 S 1 = 1 Procedendo in queste scomposizioni si giunge fino allistanza banale del problema S 1 = 1 S n = n+(n-1)+(n-2)+(n-3)+…+1

14 ALGORITMI DI ORDINAMENTO 14 Selection-sort (ordinamento per selezione) Sia A un array di n elementi da ordinare. L algoritmo selection-sort seleziona lelemento con valore minore e lo scambia con il primo elemento. Tra gli n-1 elementi rimasti viene poi ricercato quello con valore minore e scambiato con il secondo e così di seguito fino allultimo elemento. METODO: Iteriamo i seguenti passi: larray A è diviso in 2 parti Parte iniziale ordinata| parte da ordinare Parte iniziale ordinata | parte da ordinare cerchiamo lelemento minimo nella parte non ordinata e lo scambiamo con il primo della parte non ordinata

15 ALGORITMI DI ORDINAMENTO 15 Per i=n-1: Per i=n-1: A[1..n-2] | A[n-1],A[n] ARRAY A ORDINATO! cerca il minimo tra A[n-1] e A[n], scambialo con A[n-1] ARRAY A ORDINATO! Parte iniziale ordinata | parte da ordinare Selection-sort Selection-sort I iterazione: A[1..n] non ordinato, cerca minimo di A[1..n] e scambialo con A[1]. Quindi: A[1] | A[2..n] II iterazione: A[1] ordinato, A[2..n] non ordinato, cerca minimo di A[2..n] e scambialo con A[2]. Quindi: A[1]A[2] | A[3..n] generica iterazione: A[1..i-1] ordinato, A[i..n] non ordinato, cerca minimo di A[i..n] e scambialo con A[i]. Quindi: A[1..i-1] A[i]| A[i+1,..n]

16 ALGORITMI DI ORDINAMENTO 16 SelectionSort(A, min, temp) for i=1 to n-1 do min := i for j=i+1 to n do If A(min)>A(j) then min := j endif endfor temp = A[min] A[min] = A[i] A[i] = temp endfor SelectionSort(A, min, temp) for i=1 to n-1 do min := i for j=i+1 to n do If A(min)>A(j) then min := j endif endfor temp = A[min] A[min] = A[i] A[i] = temp endfor 15 Esempio selection-sort: Sia A un array di 6 elementi da ordinare in modo crescente min := i j=2 min=1min= for j=i+1 to n do If A(min)>A(j) then min := j endif for j=i+1 to n do If A(min)>A(j) then min := j endif j=3 5 min=3 j=4 j=6j=5 temp = A[min] A[min] = A[i] A[i] = temp temp = A[min] A[min] = A[i] A[i] = temp 11 1 i=1 i=1 i=2 i=2 min := i min=2 for j=i+1 to n do If A(min)>A(j) then min := j endif j=3j=4j=5j=6 for j=i+1 to n do If A(min)>A(j) then min := j endif temp = A[min] A[min] = A[i] A[i] = temp 5 5 i=3 i=3 temp = A[min] A[min] = A[i] A[i] = temp min := i min=3 for j=i+1 to n do If A(min)>A(j) then min := j endif j=4j= La parte sinistra del vettore è già ordinata min=5 7 j=6 for j=i+1 to n do If A(min)>A(j) then min := j endif temp = A[min] A[min] = A[i] A[i] = temp temp = A[min] A[min] = A[i] A[i] = temp min := i i=4 i=4 min=4 min := i for j=i+1 to n do If A(min)>A(j) then min := j endif min=5 j=6 for j=i+1 to n do If A(min)>A(j) then min := j endif temp = A[min] A[min] = A[i] A[i] = temp 11 temp j=5 temp = A[min] A[min] = A[i] A[i] = temp min := i i=5 i=5 min := i for j=i+1 to n do If A(min)>A(j) then min := j endif for j=i+1 to n do If A(min)>A(j) then min := j endif temp = A[min] A[min] = A[i] A[i] = temp temp = A[min] A[min] = A[i] A[i] = temp

17 ALGORITMI DI ORDINAMENTO 17 procedure ord_sel_max(in:n; inout:a) var n,indice_max:integer var a:array(1..n)of character begin for i=n,2 step=-1 do indice_max := 1 for k=2,i do if a(indice_max)

18 ALGORITMI DI ORDINAMENTO 18 Loperazione dominante per il selection-sort è il confronto tra coppie di elementi, per n-1 volte bisogna determinare il minimo tra gli elementi non ordinati e se necessario effettuare uno scambio: Durante la prima iterazione bisogna effettuare n-1 confronti per determinare il minimo tra gli n elementi. Durante la seconda iterazione bisogna effettuare n-2 confronti per determinare il minimo tra gli n-1 elementi. …. Analisi del selection-sort (1)

19 ALGORITMI DI ORDINAMENTO 19 n-i = (n-1)+(n-2)+…+2+1 = n(n-1)/2 Quindi il numero di confronti è : n-i = (n-1)+(n-2)+…+2+1 = n(n-1)/2 Per cui il tempo di esecuzione dellalgoritmo tende a n 2 Il comportamento del selection-sort è indipendente dallordine preesistente nellarray da ordinare: il caso peggiore (array ordinato in ordine decrescente) e quello migliore coincidono (array ordinato in ordine crescente) i=1 n-1 Analisi del selection-sort (2) Durante la n-1 iterazione bisogna effettuare 1 confronti per determinare il minimo tra 2 elementi.

20 ALGORITMI DI ORDINAMENTO 20 Insertion-sort (ordinamento per inserimento) Linsertion-sort è un algoritmo molto semplice che si basa sul metodo usato per ordinare le carte da gioco: per ordinare le carte nelle tue mani estrai una carta, scala le carte rimanenti, e inserisci la carta estratta nel posto corretto tra quelle già considerate e ordinate Analogamente per ordinare un vettore di interi a[1…n] in ordine crescente, consideriamo il primo elemento come un sottovettore ordinato e inseriamo gli elementi a[2],…,a[n] uno dopo laltro nella giusta posizione tra quelli già considerati e ordinati

21 ALGORITMI DI ORDINAMENTO 21 Metodo Insertion-sort: ordinare i primi 2 elementi (porzione 1..2); ordinare i primi 3 elementi (porzione 1..3), inserendo il terzo elemento nella posizione corretta rispetto ai precedenti; ordinare i primi 4 elementi (porzione 1..4), inserendo il quarto elemento nella posizione corretta rispetto ai precedenti; …… ordinare i gli n elementi (porzione 1..n),inserendo lennesimo elemento nella posizione corretta rispetto ai precedenti

22 ALGORITMI DI ORDINAMENTO 22 InsertionSort(A,n, temp) for i=2 to n do temp := a(i) j := i-1 while j>=1 and temp=1 and temp

23 ALGORITMI DI ORDINAMENTO 23 Il metodo di ordinamento ad inserzione si basa sull'idea che un vettore ordinato si ottiene inserendo le sue componenti una per una "al posto giusto". Non si introduce un secondo vettore, ma si "simula" linserzione degli elementi nel vettore dato (ordinamento in loco). Linsertion-sort è un algoritmo stabile

24 ALGORITMI DI ORDINAMENTO 24 Algoritmi di ordinamento stabili Se nellarray da ordinare ci sono due o più elementi con lo stesso valore, allora tali elementi compaiono nellarray di output nello stesso ordine in cui compaiono in quello di input. (Algoritmo Stabile) voto Carlovoto Ritavoto Mariovoto Lucavoto Paolovoto Gina Esempio (Alg. Stabile) : ordinare un vettore di voti scolastici Si conserva lordinamento sul nome!

25 ALGORITMI DI ORDINAMENTO voto Carlo a[1] voto Luca a[2] voto Gina a[3] voto Mario a[5] voto Rita a[4] voto Paolo a[6] voto Carlovoto Lucavoto Gina 578 Problema: Verificare che lalgoritmo di selection sort basato sulla selezione del massimo per ordinare in modo crescente un array A di n elementi non è stabile i=6 i=6 i=5 i=5 7 voto Paolo 6 voto Mario i=4 i=4 7 voto Paolo 5 voto Rita i=3 i=3 6 voto Mario voto Rita 5 i=2 i=2 5 voto Rita Si perde lordinamento sul nome: algoritmo non-stabile for i=n,2 step=-1 do determinare lelemento massimo della porzione 1..i dellarray metterlo allultimo posto della porzione endfor for i=n,2 step=-1 do determinare lelemento massimo della porzione 1..i dellarray metterlo allultimo posto della porzione endfor

26 ALGORITMI DI ORDINAMENTO 26 Loperazione dominante per lalgoritmo è il confronto tra coppie di elementi. L'ordinamento per inserimento inserisce gli elementi lavorando meno se essi sono gia' parzialmente ordinati. Analisi delle prestazioni dellinsertion-sort (1) Il caso migliore si ha quando il vettore è già ordinato in modo crescente in tal caso bastano n-1 confronti. Il caso peggiore si ottiene invece nel caso in cui la sequenza di elementi si presenta in ordine inverso, cioè quando larray è ordinato in modo decrescente, perchè in questo caso il numero di confronti sarà pari al numero di elementi già ordinati.

27 ALGORITMI DI ORDINAMENTO 27 Quindi il numero di confronti totali su di un array di dimensione n è: i = n-1 = n(n-1)/2 i = n-1 = n(n-1)/2 Analizziamo il caso peggiore considerando lordinamento delle carte da gioco: i=1 n-1 Analisi delle prestazioni dellinsertion-sort(2) linsertion-sort durante la prima passata esegue un confronto con con la carta più a sinistra nellarray durante la seconda passata esegue due confronti con le due carte più a sinistra dellarray); durante la n-1 esima passata vengono eseguiti al più n-1 confronti

28 ALGORITMI DI ORDINAMENTO 28 Bubble-sort (ordinamento a bolle) Lordinamento a bolle è un algoritmo semplice basato sul metodo degli scambi. Si fanno salire gli elementi più piccoli verso linizio del vettore scambiandoli con quelli adiacenti. Si procede confrontando gli elementi a coppie e ogni qualvolta si trova una coppia non ordinata si scambiano di posto i due elementi. Dato il vettore A[n], si opera confrontando A[1] con A[2] e se A[1] è maggiore di A[2], si effettua uno scambio tra i due; vengono poi confrontati A[2] con A[3], A[3] con A[4], …A[n-1] con A[n] scambiando di posto quegli elementi che non formano coppie ordinate.

29 ALGORITMI DI ORDINAMENTO 29 Alla fine dellesecuzione del primo ciclo di operazioni lelemento più grande si trova automaticamente in ultima posizione in quanto gli elementi più piccoli sono "risaliti" nel vettore come delle bolle (da qui la definizione di Bubble-Sort). Bubble-sort (ordinamento a bolle) Successivamente, al termine del secondo ciclo di operazioni, lelemento maggiore tra A[1], A[2],….A[n-1] sarà posizionato alla penultima (n-1) posizione; si procede in questo modo finchè non ci saranno più valori da scambiare (array ordinato)

30 ALGORITMI DI ORDINAMENTO 30 BubbleSort(A,n,scambio,temp) i:=1 repeat scambio:= 0 for j=i+1 to n do if (A[j] < A[j-1]) then temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:=1 endif endfor until scambio=0 end BubbleSort(A,n,scambio,temp) i:=1 repeat scambio:= 0 for j=i+1 to n do if (A[j] < A[j-1]) then temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:=1 endif endfor until scambio=0 end Esempio: Esempio: Sia A il vettore da ordinare A temp j-1=1 j=3 11 j=2 7 Scambio=0 scambio:= 0 temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:=1 Scambio=1 j-1=2 temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:=1 temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:= temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:= j=4 j-1=3 j=5 j-1=4 Il bubble-sort è un algoritmo stabile come linsertion-sort temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:= temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:=1 temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:= j=2 j-1=1 j=4 j-1= Scambio=0 Vettore Ordinato! 1915 temp:=A[j] A[j]:=A[j-1] A[j-1]:=temp scambio:=1 La condizione è falsa

31 ALGORITMI DI ORDINAMENTO 31 Nel bubble sort loperazione dominante è il confronto tra coppie di elementi, loperazione di scambio degli elementi viene eseguita meno spesso rispetto al confronto degli elementi e ha lo stesso costo. Analisi delle prestazioni del bubble-sort(1) Lalgoritmo BubbleSort esegue un numero di operazioni variabili a seconda dellordinamento già presente nel vettore Il caso migliore si ha quando larray è già ordinato ed è sufficiente effettuare solo un ciclo per verificare che tutti gli elementi sono ordinati, quindi sono sufficienti n-1 confronti. Il caso peggiore si ha quando gli elementi nellarray sono ordinati in senso decrescente.

32 ALGORITMI DI ORDINAMENTO 32 Quindi nel caso peggiore il numero di confronti e scambi su di un array di dimensione n è: (n-i) = n 1 - i = n(n-1)-n(n-1)/2 = n(n-1)/2 (n-i) = n 1 - i = n(n-1)-n(n-1)/2 = n(n-1)/2 Nel caso peggiore il bubble sort effettua i seguenti confronti: i=1 n=1n=1n=1 i=1i=1 Analisi delle prestazioni del bubble-sort(1) Durante il primo ciclo vengono eseguiti n-1 confronti e altrettanti scambi Durante il secondo ciclo vengono eseguiti n-2 confronti e altrettanti scambi Durante il terzo ciclo vengono eseguiti n-3 confronti e altrettanti scambi …. Durante ln-esimo ciclo viene eseguito un confronto e uno scambio

33 ALGORITMI DI ORDINAMENTO 33 DIVIDE ET IMPERA DIVIDE ET IMPERA dicevano i latini: sia con il significato che una volta conquistato un nuovo territorio è meglio tenere diviso il popolo, se è ostile, per evitare rivolte e sovversioni; sia con il significato di partizionare il territorio per amministrarlo meglio. Algoritmi di ordinamento ricorsivi Il motto latino Divide et Impera è stato acquisito dallinformatica come tecnica per risolvere problemi complessi, in pratica si genera una sequenza di istanze via via più semplici del problema, fino all'istanza che non è più suddivisibile e che ha soluzione banale

34 ALGORITMI DI ORDINAMENTO 34 Gli algoritmi di ordinamento visti finora possono essere realizzati anche con metodi ricorsivi. La ricorsione è un metodo molto più elegante delliterazione Selection-Sort ricorsivo La versione ricorsiva del Selection-Sort si basa su di un idea molto semplice: ordina il vettore = metti il minimo all'inizio + ordina il resto del vettore Alla prima invocazione bisogna ordinare tutto il vettore, alla seconda tutto tranne il primo, poi tutto tranne il secondo, ecc. Useremo un parametro inizio per ordinare il vettore a partire dall'indice inizio fino alla fine, ordinando la parte di vettore: A[inizio], A[inizio+1],..., A[A.length-1]

35 ALGORITMI DI ORDINAMENTO 35 Metodo ricorsivo Selection-Sort: Metto il minimo in prima posizione, poi ordino quello che resta del vettore. Algoritmo ricorsivo del Selection-Sort Cerco il minimo fra A[inizio], A[inizio+1],..., A[A.length-1] Lo metto in A[inizio] (faccio lo scambio) Faccio la chiamata ricorsiva passando inizio+1 Manca ancora il caso base della ricorsione! SelectRic(int A[], int inizio) { int i, minpos; minpos=inizio; for(i=inizio; i

36 ALGORITMI DI ORDINAMENTO 36 Selection-Sort caso base: Ogni volta che viene richiamata la funzione SelectRic (invocazione del metodo), la parte di vettore da ordinare ha un elemento in meno. Alla fine si arriva al vettore di un elemento, questo succede quando inizio è l'ultimo elemento del vettore. In pratica: inizio aumenta di uno a ogni invocazione ricorsiva e quando arriva alla fine si deve ordinare la parte di vettore con un elemento solo (che è già banalmente ordinato!) SelectRic(int A[], int inizio) { int i, minpos; if(inizio>=A.length-1) return; minpos=inizio; for(i=inizio; i=A.length-1) return; minpos=inizio; for(i=inizio; i

37 ALGORITMI DI ORDINAMENTO 37 Nellordinamento a bolle dobbiamo far risalire gli elementi più leggeri (più piccoli) fino alla cima del vettore. Bubble-Sort ricorsivo Il ciclo for mette il massimo alla fine, dopo aver fatto questo, resta da ordinare il resto del vettore (tutto tranne l'ultimo elemento). Nella chiamata ricorsiva viene specificato dove il vettore termina (cioè dove finisce la parte di vettore da ordinare) Faccio il ciclo di confronti, che mette il massimo alla fine. Faccio l invocazione ricorsiva su tutto il vettore tranne lultimo elemento. Manca il caso base! BubbleRic(int A[], int fine) { int i, temp; for(i=0; i A[i+1]) { temp=A[i]; A[i]=A[i+1]; A[i+1]=temp; } BubbleRic(A, fine-1); } BubbleRic(int A[], int fine) { int i, temp; for(i=0; i A[i+1]) { temp=A[i]; A[i]=A[i+1]; A[i+1]=temp; } BubbleRic(A, fine-1); }

38 ALGORITMI DI ORDINAMENTO 38 Bubble-Sort: caso base La parte di vettore da ordinare diventa sempre più piccola a ogni invocazione ricorsiva. Alla prima invocazione fine vale A.length-1 poi diminusce di uno, poi ancora di uno, ecc. Quando fine==0 la parte di vettore da ordinare è il solo primo elemento (che è già ordinato!) BubbleRic(A[], fine) { int i, temp; // CASO BASE if(fine==0) return; // CASO BASE for(i=0; i<=fine-1; i++) if(A[i]>A[i+1]) { temp=A[i]; A[i]=A[i+1]; A[i+1]=temp; } BubbleRic(A, fine-1); } BubbleRic(A[], fine) { int i, temp; // CASO BASE if(fine==0) return; // CASO BASE for(i=0; i<=fine-1; i++) if(A[i]>A[i+1]) { temp=A[i]; A[i]=A[i+1]; A[i+1]=temp; } BubbleRic(A, fine-1); }

39 ALGORITMI DI ORDINAMENTO 39 Insertion-Sort ricorsivo Lidea di ordinamento è simile al modo che, durante una partita a carte, si usa per ordinare le carte nella propria mano. Si inizia con la mano vuota e le carte capovolte sul tavolo Poi si prende una carta alla volta dal tavolo e si inserisce nella giusta posizione Per trovare la giusta posizione per una carta, la confrontiamo con le altre carte nella mano, da destra verso sinistra. Ogni carta più grande verrà spostata verso destra in modo da fare posto alla carta da inserire. Linsertion-Sort è uno algoritmo di ordinamento molto efficiente per ordinare un piccolo numero di elementi

40 ALGORITMI DI ORDINAMENTO 40 INSERTION SORT RICORSIVO start from = 1 insertion_sort( A, from, to) { if ( from+1 > to ) { // CASO BASE from > to il vettore è ordinato temp = A[from+1]); i = from; while ( i>0 AND A[i] > temp) { // passo base A[i+1]=A[i]; i=i-1; } A[i+1] = temp; insertion_sort( A, from+1, to) // RICORSIONE } INSERTION SORT RICORSIVO start from = 1 insertion_sort( A, from, to) { if ( from+1 > to ) { // CASO BASE from > to il vettore è ordinato temp = A[from+1]); i = from; while ( i>0 AND A[i] > temp) { // passo base A[i+1]=A[i]; i=i-1; } A[i+1] = temp; insertion_sort( A, from+1, to) // RICORSIONE }

41 ALGORITMI DI ORDINAMENTO 41 Un altro modo per confrontare le prestazioni degli algoritmi di ordinamento consiste, semplicemente, nelleseguire molti test per ogni algoritmo al crescere della dimensione n dellinput e nel confrontarne i tempi di esecuzione misurati tenendo conto dei casi in cui il vettore è ordinato in modo crescente, decrescente e random. I tempi sono generalmente espressi nella forma minuti secondi. Questo tipo di misurazione ha lo svantaggio che i tempi di esecuzione degli algoritmi dipendono dalle prestazioni della macchina su cui sono eseguiti (velocità del processore, capacità della memoria centrale), per cui il tempo di esecuzione di un algoritmo può variare notevolemente se eseguito su macchine differenti. Prestazioni degli algoritmi di ordinamento (risultati sperimentali)

42 ALGORITMI DI ORDINAMENTO 42 Questi sono i risultati forniti da un programma (eseguito su un Pentium 3 di 500 MegaHertz) utilizzato per ordinare con gli algoritmi analizzati in questo corso un vettore di elementi. I tempi sono nella forma minuti secondi.

43 ALGORITMI DI ORDINAMENTO 43 Implementazione degli algoritmi di sorting Gli algoritmi di sorting si possono implementare in svariati modi (Java, linguaggio C, Visual Basic, MATLAB, etc.) in questo corso abbiamo scelto il metodo più semplice, cioè le macro di Excel. Questa scelta è mirata a motivare linteresse di tutti gli alunni, compresi quelli che potrebbero ritenere difficile luso di metodi più sofisticati. Analizziamo delle semplici simulazioni degli algoritmi di sorting che sono state sviluppate con le macro di Microsoft Excel

44 ALGORITMI DI ORDINAMENTO BubbleSort 3-D (curiosità) Al seguente link è disponibile un algoritmo 3-D per ordinare pixel di colori con il Bubble sort 3-D Eseguibile BubbleSort 3-D

45 ALGORITMI DI ORDINAMENTO Riferimenti /Sort2-E.html htm


Scaricare ppt "Algoritmi di ordinamento Calzetta Emilia Cervone Vincenzo Didattica della programmazione I Prof. Giulio Giunta Didattica della programmazione I Prof. Giulio."

Presentazioni simili


Annunci Google