Algoritmi di ordinamento

1,076 views
1,053 views

Published on

Conting Sort, Bucket sort, Radix sort

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,076
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Algoritmi di ordinamento

  1. 1. Algoritmi di ordinamento “Un ordine perfetto è il fondamento di tutte le cose” (Edmund Burke 1729 -1797) Calzetta Emilia Cervone Vincenzo De Rosa Tiziana Iuzzolino Vita
  2. 2. 10/04/11 Didattica della Programmazione II Programmazione didattica <ul><li>Titolo: Algoritmi di ordinamento (non in loco) </li></ul><ul><li>Classe: 4^ anno I.T.I. </li></ul><ul><li>Contenuti: </li></ul><ul><li>Algoritmi di ordinamento non in loco: </li></ul><ul><ul><li>Counting Sort </li></ul></ul><ul><ul><li>Radix Sort </li></ul></ul><ul><ul><li>Bucket Sort </li></ul></ul><ul><li>Analisi della complessità nel caso peggiore </li></ul><ul><li>Esercitazioni guidate in linguaggio VBA </li></ul><ul><li>Riferimenti: </li></ul><ul><li>Cormen, Leiserson, Rivest- Introduzione agli algoritmi -McGrawHill </li></ul>
  3. 3. 10/04/11 Didattica della Programmazione II Programmazione didattica <ul><li>Prerequisiti e verifica: </li></ul><ul><ul><li>Conoscenze sull’organizzazione dei dati mediante la struttura vettoriale </li></ul></ul><ul><ul><li>Conoscenze della teoria della ricorsione e dell’iterazione </li></ul></ul><ul><ul><li>Conoscenze degli algoritmi di ordinamento in loco </li></ul></ul><ul><ul><li>Conoscenze del linguaggio Visual Basic e delle Macro di Excel </li></ul></ul><ul><li>Modalità di lavoro: </li></ul><ul><ul><li>lezioni frontali </li></ul></ul><ul><ul><li>utilizzo del laboratorio </li></ul></ul><ul><ul><li>Verifica formativa svolta con l’ausilio di test on line </li></ul></ul><ul><li>Obiettivi: </li></ul><ul><ul><li>Saper gestire l’organizzazione e ordinamento dei dati in un vettore </li></ul></ul><ul><ul><li>Capire l’importanza dell’ordinamento dei dati </li></ul></ul><ul><ul><li>Capire le diverse tipologie di ordinamento </li></ul></ul><ul><ul><li>Analizzare le applicazioni relative agli argomenti teorici affrontati </li></ul></ul>
  4. 4. 10/04/11 Didattica della Programmazione II Ordinamento di un vettore A = Vettore ordinato A [ i ] ≤ A [ j ] con i , j = 1, …,4 e i < j <ul><li>Un vettore (array) rappresenta un insieme di elementi dello stesso tipo: gli elementi si distinguono uno dall’altro mediante un indice. L’insieme dei valori assumibili dagli indici di un’array dipende dal numero complessivo degli elementi dell’array (SIZE) </li></ul><ul><ul><ul><ul><ul><li>A = </li></ul></ul></ul></ul></ul>Dato un vettore A di interi, ordinarlo in modo crescente (non-decrescente) significa trasformarlo in modo tale che, per ogni indice i, l’elemento A[i] sia minore o uguale di tutti gli altri elementi di indice j, con i<j Esempio: A = Vettore iniziale 1 2 3 4 10 2 13 2 10 2 13 2 2 2 10 13
  5. 5. 10/04/11 Didattica della Programmazione II Tipi di ordinamento Ordinamento Interno: I dati da ordinare sono tutti contenuti nella memoria centrale. Per tale motivo hanno il principale limite di non permettere l'ordinamento di grosse sequenze di informazioni. Ordinamento Esterno: I dati da ordinare non possono essere tutti caricati in memoria centrale contemporaneamente, per cui si lavora su memoria di massa. Tipicamente fanno uso di strutture file per la memorizzazione e le operazioni di ordinamento dei dati da ordinare. Ordinamento in loco: Un algoritmo ordina in loco se durante la sua esecuzione, oltre al vettore da ordinare, usa un numero costante di locazioni ausiliarie di memoria (non dipendente da n). Ordinamento non in loco: Un algoritmo di ordinamento non in loco usa un numero di locazioni ausiliarie di memoria che variano a seconda del vettore da ordinare
  6. 6. Ordinamento stabile 10/04/11 Didattica della Programmazione II Un algoritmo di ordinamento è stabile se gli elementi con lo stesso valore nel vettore da ordinare rispettano la regola che il valore che compare per primo nel vettore di input, appare per primo anche nel vettore di output voto Carlo voto Rita voto Mario voto Luca voto Paolo voto Gina 5 5 6 7 7 8 Esempio: ordinare un vettore di voti scolastici Si conserva l’ordinamento sul nome!
  7. 7. Counting-sort 10/04/11 Didattica della Programmazione II Il Counting Sort si basa sull’ipotesi che ognuno degli n elementi in ingresso sia un intero nell’intervallo da 1 a k. L’algoritmo prende in ingresso un vettore, restituisce un secondo vettore ordinato ed utilizza un vettore di appoggio per l’elaborazione. Nel caso in cui vi siano elementi con lo stesso valore l’algoritmo rispetterà nel vettore ordinato l’ordine che avevano nel vettore di partenza (algoritmo stabile). Si determina, per ogni elemento x in input, il numero di elementi minori di x. Questa informazione può essere usata per porre l’elemento x, direttamente nella sua esatta posizione nell’array di output. Per es., se vi sono 10 elementi minori di x, x va messo in undicesima posizione nell’array di output.
  8. 8. Counting-sort 10/04/11 Didattica della Programmazione II CountingSort(A[1…n];B[1…n];k) for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for i  2 to k do C[i]  C[i] + C[i -1] for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for i  2 to k do C[i]  C[i] + C[i -1] for i  2 to k do C[i]  C[i] + C[i -1] <ul><li>Nell’algoritmo di counting-sort si usano 3 vettori: </li></ul><ul><ul><li>Vettore di partenza: A[1,…,n] di n interi </li></ul></ul><ul><ul><li>Vettore risultato: B [1,…,n] di n interi </li></ul></ul><ul><ul><li>Vettore delle occorrenze: C[1,…,k] di k interi: è un vettore temporaneo di lavoro e k é il valore più grande trovato nel vettore di partenza A </li></ul></ul>Il counting-sort si suddivide in 3 fasi for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1
  9. 9. Counting sort (prima fase) 10/04/11 Didattica della Programmazione II Si scorre tutto l’array partendo da A [1] fino ad arrivare ad A [ n ]; se il valore di un elemento in input é “ i ”, si incrementa C[ i ]. Così, alla fine C[ i ] = numero di elementi di A uguali ad i per ciascun intero i=1,2,…,k (k è il valore più grande degli elementi di A) 3 6 1 3 4 2 4 1 A 2 3 4 5 7 6 C 0 0 0 0 0 0 1 2 3 4 5 6 1 1 2 1 1 1 2 Vettore delle occorrenze for i  1 to k do C[i]  0 for i  1 to k do C[i]  0 for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for j  1 to n do C[A[j]]  C[A[j]] + 1 j=1 j=2 j=3 j=4 j=5 j=6 j=7
  10. 10. Counting sort (seconda fase) 10/04/11 Didattica della Programmazione II Si determina per ciascun i = 1,2,…,k, quanti elementi dell'input sono minori o uguali ad i. Questo viene fatto determinando C [ i ] = C [ i ] + C [ i-1 ] per i=2,…,K C 1 2 2 0 1 1 1 2 3 4 5 6 1+1=2 for i  2 to k do C[i]  C[i] + C[i -1] for i  2 to k do C[i]  C[i] + C[i -1] i= 2 2 2+2=4 i= 3 4 i= 4 6 i= 5 6 7 4+2=6 6+0=6 i= 6 6+1=7 Alla fine della seconda fase abbiamo ottenuto il vettore delle occorrenze multiple.
  11. 11. Counting sort (terza fase) 10/04/11 Didattica della Programmazione II Sistemiamo i valori del vettore A (input) nel vettore B (output). Partendo dall’ultima posizione di A, si prende il numero contenuto in A [ 8 ] = 4. Guardiamo cosa è contenuto in C [ 4 ] = 6, quindi mettiamo il 4 in B [ 6 ] e decrementiamo C [ 4 ] B 1 2 3 4 5 7 6 3 6 1 3 4 2 4 1 A 2 3 4 5 7 6 C 1 6 4 6 7 2 1 2 3 4 5 6 C[4]=C[4]-1 4 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 O O for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 j=7
  12. 12. 10/04/11 Didattica della Programmazione II 4 B 1 2 3 4 5 7 6 3 6 1 3 4 2 4 1 A 2 3 4 5 7 6 O C 1 5 4 6 7 2 1 2 3 4 5 6 O C[4]=C[4]-1 4 C[2]=C[2]-1 O O 2 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 j=6 j=5
  13. 13. 10/04/11 Didattica della Programmazione II 2 4 4 B 1 2 3 4 5 7 6 3 6 1 3 4 2 4 1 A 2 3 4 5 7 6 O C 1 4 4 6 7 1 1 2 3 4 5 6 O C[1]=C[1]-1 1 O O C[3]=C[3]-1 3 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 j=3 j=4
  14. 14. 10/04/11 Didattica della Programmazione II 1 2 3 4 4 B 1 2 3 4 5 7 6 3 6 1 3 4 2 4 1 A 2 3 4 5 7 6 O C 0 4 3 6 7 1 1 2 3 4 5 6 C[6]=C[6]-1 6 O O C[3]=C[3]-1 Vettore Ordinato! 3 O for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 j=2 j=1
  15. 15. 10/04/11 Didattica della Programmazione II Esaminando l’algoritmo si osserva che vi sono due cicli di lunghezza k (elemento più grande) e due di lunghezza n (lunghezza del vettore da ordinare) Analisi del counting-sort Ciclo di inizializzazione di C: Il tempo di esecuzione cresce in modo lineare al crescere di K Quindi il tempo di esecuzione dell’algoritmo cresce in modo lineare al crescere di (n+k) e se k cresce linearmente con n, allora il tempo di esecuzione del counting-sort cresce in modo lineare al crescere di n. for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for i  2 to k do C[i]  C[i] + C[i -1] for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 Ciclo di calcolo delle occorrenze semplici: Il tempo di esecuzione tende a (n) Ciclo di calcolo delle occorrenze multiple: Il tempo di esecuzione tende a (K) Ciclo di ricopiatura in B: Il tempo di esecuzione tende a (n), for i  1 to k do C[i]  0 for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for j  1 to n do C[A[j]]  C[A[j]] + 1 for i  2 to k do C[i]  C[i] + C[i -1] for i  2 to k do C[i]  C[i] + C[i -1] for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1
  16. 16. 10/04/11 Didattica della Programmazione II <ul><ul><li>L’ordine dei numeri non influisce sulle prestazioni dell’algoritmo, il tempo impiegato nel caso in cui l’array è ordinato in ordine inverso (decrescente) equivale al tempo impiegato nel caso in cui l’array è già ordinato in ordine crescente </li></ul></ul>
  17. 17. 10/04/11 Didattica della Programmazione II Counting sort: esempio pratico (1) 20 C ES 50 C IT 20 C FR 10 C DE 5 C IT 1 C ES 10 C ES 1 C FR 10 C FR 20 C IT 10 C IT 1 C IT Usiamo il counting sort per ordinare dei centesimi di euro, supponendo che le monete siano originarie dei seguenti paesi europei: Germania (DE); Spagna (ES); Francia (FR); Italia (IT) Occorrenze prima fase Occorrenze seconda fase for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for j  1 to n do C[A[j]]  C[A[j]] + 1 3 0 1 4 3 1 for i  2 to k do C[i]  C[i] + C[i -1] for i  2 to k do C[i]  C[i] + C[i -1]
  18. 18. 10/04/11 Didattica della Programmazione II 1 C IT 10 C IT Counting sort: esempio pratico (2) Considerando il vettore delle occorrenze calcolato nella seconda fase del Counting sort ordiniamo il vettore 20 C ES 50 C IT 20 C FR 10 C DE 5 C IT 1 C ES 10 C ES 20 C IT 10 C IT 2 7 Completare l’esempio per esercizio 10 C FR 6 10 C FR 1 C FR 1 K L’algoritmo è stabile e corretto! 1 C IT 1 C FR for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1 for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1
  19. 19. Counting sort: esercitazione guidata 10/04/11 Didattica della Programmazione II <ul><li>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 è stata fatta per 3 motivi: </li></ul><ul><ul><li>Per la semplicità di utilizzo delle macro di Excel </li></ul></ul><ul><ul><li>Per motivare l’interesse di tutti gli alunni, compresi quelli che potrebbero considerare ‘noioso’ l’uso di metodi più sofisticati. </li></ul></ul><ul><ul><li>Per rendere l’esempio indipendente da uno specifico ambiente di sviluppo e quindi portabile e riutilizzabile sia per il docente che per gli alunni </li></ul></ul><ul><li>Esercizio: Realizzare con le macro di Excel in linguaggio Visual Basic una simulazione dell’algoritmo del counting sort </li></ul>
  20. 20. 10/04/11 Didattica della Programmazione II For i = 1 To 10 Cells(riga + 2, colonna + i) = 0 Next For j = 1 To 10 Cells(riga + 2, colonna + Cells(riga, colonna + j)) = Cells(riga + 2, colonna + Cells(riga, colonna + j)) + 1 Next For i = 2 To 10 Cells(riga + 2, colonna + i) = Cells(riga + 2, colonna + i) + Cells(riga + 2, colonna + i - 1) Next For j = 10 To 1 Step -1 Cells(riga + 4, colonna + Cells(riga + 2, colonna + Cells(riga, colonna + j))) = Cells(riga, colonna + j) Cells(riga + 2, colonna + Cells(riga, colonna + j)) = Cells(riga + 2, colonna + Cells(riga, colonna + j)) - 1 for i  1 to k do C[i]  0 for j  1 to n do C[A[j]]  C[A[j]] + 1 for i  2 to k do C[i]  C[i] + C[i -1] for j  n downto 1 do B[C[A[j]]]  A[j], C[A[j]]  C[A[j]] -1
  21. 21. Bucket sort <ul><li>Il Bucket Sort opera suddividendo gli elementi da ordinare in sottoinsiemi di uguale dimensione, bucket (cestini) e di ordinare poi i sottoinsiemi più piccoli di elementi </li></ul>10/04/11 Didattica della Programmazione II Esempio : Ordinare un mazzo di carte da ramino Il bucket cuori conterrà le carte di cuori Il bucket quadri conterrà le carte di quadri Il bucket picche conterrà le carte di picche Il bucket fiori conterrà le carte di fiori <ul><li>Dividiamo le carte in base al seme. </li></ul><ul><li>Ordiniamo ogni singolo mazzo di carte con lo stesso seme. </li></ul>
  22. 22. Bucket sort : idea di base <ul><li>Dunque l’ordinamento dell’insieme originale si ottiene ordinando con un algoritmo elementare ogni singolo bucket e giustapponendo gli elementi dei bucket nell’ordine naturale. </li></ul>10/04/11 Didattica della Programmazione II Supponendo che i valori degli n elementi dell’insieme A da ordinare siano distribuiti uniformemente nell’intervallo [ s , t ). La strategia risolutiva si basa quindi sull’idea di suddividere l’intervallo [ s , t ) in n sottointervalli [ s i , t i ) ( i = 1, 2, . . . , n ; t i = s i +1 per ogni i < n ) di uguale dimensione che chiameremo bucket e di inserire in ogni bucket gli elementi a k  A che rientrano nell’intervallo corrispondente ( s i  a k < t i ). L’ipotesi iniziale sulla distribuzione uniforme degli elementi di A nell’intervallo [ s , t ) ci garantisce che ogni bucket conterrà solo pochi elementi.
  23. 23. Bucket sort : algoritmo 10/04/11 Didattica della Programmazione II <ul><li>BucketSort(A[1..n]) </li></ul><ul><li>for i  1 to n do </li></ul><ul><ul><li>trova in quale B[x] va inserito l’elemento A[i] e inseriscilo </li></ul></ul><ul><li>for i  1 to k do </li></ul><ul><ul><li>ordina il B[i] con un algoritmo di ordinamento </li></ul></ul><ul><li>Concatena insieme i B[1]…B[2]………B[k] </li></ul><ul><li>Nell’algoritmo di BucketSort si usano 2 vettori: </li></ul><ul><li>Vettore di partenza: A[1,…,n] di n interi </li></ul><ul><li>Vettore di liste a doppio concatenamento B[1],B[2],…B[k] , dove ogni elemento rappresenta un bucket </li></ul>Il backet-sort si suddivide in 3 fasi Prima fase <ul><li>for i  1 to n do </li></ul><ul><ul><li>trova in quale B[x] va inserito </li></ul></ul><ul><ul><li>l’elemento A[i] e inseriscilo </li></ul></ul><ul><li>for i  1 to n do </li></ul><ul><ul><li>trova in quale B[x] va inserito </li></ul></ul><ul><ul><li>l’elemento A[i] e inseriscilo </li></ul></ul>Seconda fase <ul><li>for i  1 to k do </li></ul><ul><ul><li>ordina il B[i] con un algoritmo di ordinamento </li></ul></ul><ul><li>for i  1 to k do </li></ul><ul><ul><li>ordina il B[i] con un algoritmo di ordinamento </li></ul></ul>Terza fase Concatena insieme i B[1]…B[2]………B[k] Concatena insieme i B[1]…B[2]………B[k]
  24. 24. Esempio: situazione iniziale <ul><li>Esecuzione di Bucket Sort su un array di input A [ 8 ], dove ogni elemento di A é un double positivo. </li></ul>10/04/11 Didattica della Programmazione II A Supponiamo di dividere l'intervallo [0…1], in 10 sotto intervalli di uguale dimensione, e quindi distribuire gli n elementi da ordinare nei bucket. 0 1 2 3 4 5 6 7 8 9 0.78 0.17 0.35 0.26 0.72 0.94 0.21 0.12
  25. 25. Esempio: Ripartizione nei bucket <ul><li>I numeri vengono distribuiti nei bucket </li></ul>10/04/11 Didattica della Programmazione II A 0.78 0.17 0.35 0.26 0.72 0.94 0.21 0.12 0 1 2 3 4 5 6 7 8 9 0.78 0.17 0.35 0.26 0.72 0.94 0.21 0.12
  26. 26. Esempio: Ordinamento bucket 10/04/11 Didattica della Programmazione II La seconda operazione che deve eseguire Bucket Sort é quella di ordinare i numeri di ogni bucket, con un algoritmo di ordinamento “adatto”, in questo caso, visto che l'insieme numerico in input é composto da tipi double, si può utilizzare l’algoritmo di ordinamento Insert Sort. 0 1 2 3 4 5 6 7 8 9 0.78 0.17 0.35 0.26 0.72 0.94 0.21 0.12 0 1 2 3 4 5 6 7 8 9 0.78 0.17 0.35 0.26 0.72 0.21 0.12 0.94
  27. 27. Esempio: Composizione array ordinato 10/04/11 Didattica della Programmazione II La terza ed ultima operazione da eseguire, é quella di concatenare insieme le liste (bucket) B[0], B[1], ..., B[n-1] in quest'ordine copiando gli elementi nell'array originale. 0.78 0.17 0.35 0.26 0.72 0.21 0.12 0.94 A 0.12 0.17 0.21 0.26 0.35 0.72 0.78 0.94 0 1 2 3 4 5 6 7 8 9
  28. 28. Bucket sort : correttezza 10/04/11 Didattica della Programmazione II La correttezza dell’algoritmo può essere provata molto facilmente Supponiamo che in A esistano due elementi distinti a h < a k ; durante l’esecuzione del primo ciclo dell’algoritmo, i due elementi possono finire in due bucket distinti B i e B j oppure nello stesso bucket B i. Nel primo caso con la terza fase i due elementi risulteranno disposti nell’ordine corretto in A ; nel secondo caso sarà la chiamata dell’algoritmo INSERTIONSORT sul bucket Bi a collocare nell’ordine reciproco corretto i due elementi. <ul><li>BucketSort(A[1..n]) </li></ul><ul><li>for i  1 to n do </li></ul><ul><ul><li>trova in quale B[x] va inserito l’elemento A[i] e inseriscilo </li></ul></ul><ul><li>for i  1 to k do </li></ul><ul><ul><li>ordina il B[i] con un algoritmo di ordinamento </li></ul></ul><ul><li>Concatena insieme i B[1]…B[2]………B[k] </li></ul>
  29. 29. BucketSort : analisi (1) 10/04/11 Didattica della Programmazione II La complessità di tempo dell’algoritmo dipende dall’algoritmo utilizzato per ordinare gli elementi nei singoli cestini. In generale la complessità dell’algoritmo è O ( n ), anche se nella seconda fase viene invocato un algoritmo di complessità più elevata. Infatti l’insieme su cui deve operare INSERTIONSORT è ridotto a pochi elementi e, per ogni bucket dotato di più di un elemento, esisteranno altrettanti bucket completamente vuoti. Questo consente di bilanciare il numero di operazioni svolte dall’algoritmo, che si mantiene quindi lineare. <ul><li>BucketSort(A[1..n]) </li></ul><ul><li>for i  1 to n do </li></ul><ul><ul><li>trova in quale B[x] va inserito l’elemento A[i] e inseriscilo </li></ul></ul><ul><li>for i  1 to k do </li></ul><ul><ul><li>ordina il B[i] con un algoritmo di ordinamento </li></ul></ul><ul><li>Concatena insieme i B[1]…B[2]………B[k] </li></ul>
  30. 30. BucketSort : analisi (2) 10/04/11 Didattica della Programmazione II La complessità di spazio dell’algoritmo è O ( n ) Infatti durante il primo ciclo di for , l’algoritmo alloca lo spazio necessario per inserire gli n elementi del vettore A nei rispettivi bucket. Per questa ragione il BucketSort è definito algorimo di ordinamento non il loco. <ul><li>BucketSort(A[1..n]) </li></ul><ul><li>for i  1 to n do </li></ul><ul><ul><li>trova in quale B[x] va inserito l’elemento A[i] e inseriscilo </li></ul></ul><ul><li>for i  1 to k do </li></ul><ul><ul><li>ordina il B[i] con un algoritmo di ordinamento </li></ul></ul><ul><li>Concatena insieme i B[1]…B[2]………B[k] </li></ul>
  31. 31. <ul><li>Il Radix Sort è un algoritmo di ordinamento utilizzato per ordinare record con chiavi multiple . </li></ul><ul><li>Che cos’è una chiave di ordinamento </li></ul><ul><li>Che cos’è un record con chiavi multiple </li></ul>Radix-sort 10/04/11 Didattica della Programmazione II
  32. 32. Chiave di ordinamento (1) 10/04/11 Didattica della Programmazione II Il valore su cui si effettua l’ordinamento 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) occorre definire bene la chiave dell’ordinamento. type studente : record cognome : character nome : character matricola : integer media : integer end var stud1,stud2,stud3,stud4,stud5 : studente Esempio: Ordinamento per cognome e nome (Es. ordinamento alfabetico del registro di classe) Ordinamento per media (con valori ripetuti)
  33. 33. Chiave di ordinamento (2) 10/04/11 Didattica della Programmazione II Problema: ordinare in ordine crescente un insieme di studenti considerando le chiavi di ordinamento: Key1= cognome; Key2= nome; Key3= matricola; Key4= media scolastica; Ordinamento crescente per matricola Key1 Verdi Bianchi Russo Bianchi Esposito Neri Key2 Mario Antonio Carlo Gianni Luca Marco Key3 00130 00134 00120 00127 00140 00124 Key4 6 9 6 8 5 7 1 2 3 4 5 6 Key1 Russo Neri Bianchi Verdi Bianchi Esposito Key2 Carlo Marco Gianni Mario Antonio Luca Key3 00120 00124 00127 00130 00134 00140 Key4 6 7 8 6 9 5
  34. 34. Chiave di ordinamento (3) 10/04/11 Didattica della Programmazione II Key1= cognome; Key2= nome; Key3= matricola; Key4= media scolastica; Ordinamento crescente per media scolastica Key1 Verdi Bianchi Russo Bianchi Esposito Neri Key2 Mario Antonio Carlo Gianni Luca Marco Key3 00130 00134 00120 00127 00140 00124 Key4 6 9 6 8 5 7 1 2 3 4 5 6 Key1 Esposito Verdi Russo Neri Bianchi Bianchi Key2 Luca Mario Carlo Marco Gianni Antonio Key3 00140 00130 00120 00124 00127 00134 Key4 5 6 6 7 8 9
  35. 35. Chiave di ordinamento (4) 10/04/11 Didattica della Programmazione II Key1= cognome; Key2= nome; Key3= matricola; Key4= media scolastica; Ordinamento crescente per cognome e nome Key1 Verdi Bianchi Russo Bianchi Esposito Neri Key2 Mario Antonio Carlo Gianni Luca Marco Key3 00130 00134 00120 00127 00140 00124 Key4 6 9 6 8 5 7 1 2 3 4 5 6 Key1 Bianchi Bianchi Esposito Neri Russo Verdi Key2 Antonio Gianni Luca Marco Carlo Mario Key3 00134 00127 00140 00124 00120 00130 Key4 9 8 5 7 6 6
  36. 36. Esempi <ul><li>Un esempio di record con chiavi multiple è dato dalla data </li></ul><ul><li>gg/mm/aaaa </li></ul><ul><li>Per ordinare per data si deve ordinare l’anno e a parità di anno si deve ordinare per mese e a parità di mese per giorno. </li></ul><ul><li>Un altro esempio di record a chiave multipla è dato dal considerare le cifre di un intero </li></ul><ul><li>2 1 9 </li></ul><ul><li>come chiavi separate. Per ordinare interi si ordina per la cifra di posizione maggiore e in caso di parità per quelle di ordine via via minore. </li></ul>10/04/11 Didattica della Programmazione II
  37. 37. Radix-sort 10/04/11 Didattica della Programmazione II Il Radix Sort è un algoritmo di ordinamento utilizzato per ordinare record con chiavi multiple. L’algoritmo si basa sull’ipotesi che ognuno degli n elementi del vettore da ordinare sia composto da d cifre. <ul><ul><li>L‘idea, consiste nell'utilizzare un qualsiasi algoritmo di ordinamento, che ordini il vettore usando come chiave di ordinamento la cifra meno significativa. </li></ul></ul><ul><ul><li>Quando l'intero vettore è ordinato sulla cifra meno significativa, lo si ordina sulla seconda cifra meno significativa utilizzando un algoritmo stabile. </li></ul></ul><ul><ul><li>Il processo continua finché gli elementi sono stati ordinati su tutte le d cifre. </li></ul></ul><ul><ul><li>A quel punto, gli elementi sono completamente ordinati. </li></ul></ul>
  38. 38. Radix-sort 10/04/11 Didattica della Programmazione II L’algoritmo prende in input un vettore ed il numero d di cifre che compongono l’elemento, restituisce ad ogni iterazione un vettore parzialmente ordinato, alla d-esima iterazione restituisce il vettore ordinato. Nel caso in cui vi siano elementi con lo stesso valore l’algoritmo rispetterà nel vettore ordinato l’ordine che avevano nel vettore di partenza (algoritmo stabile). Radix-Sort(A:Vettore; d: int) For (i=1; i<=d; i++) Usa un algoritmo di ordinamento stabile per ordinare il vettore A sulla cifra i.
  39. 39. Radix-sort 10/04/11 Didattica della Programmazione II Applichiamo l’algoritmo Radix-sort su un array di input A [ 7 ], dove ogni elemento di A é un intero positivo. 329 457 657 839 436 720 355 Array da ordinare 3, 2, 9 4, 5, 7 6, 5, 7 8, 3, 9 4, 3, 6 7, 2, 0 3, 5, 5
  40. 40. Radix-sort 10/04/11 Didattica della Programmazione II <ul><li>Ad ogni ordinamento sulla chiave (cifra meno significativa), deve corrispondere uno spostamento di tutta la struttura (il numero in esame). Per questo, é importante che l'ordinamento intermedio venga eseguito da un algoritmo di ordinamento stabile. </li></ul>720 355 436 457 657 329 839 <ul><li>La prima operazione che deve eseguire Radix-sort, é quella di effettuare l'ordinamento, usando come chiave di ordinamento, la cifra meno significativa dei numeri stessi. </li></ul>1° iterazione For (i=1; i<=d; i++) i=1; d=3 3, 2, 9 4, 5, 7 6, 5, 7 8, 3, 9 4, 3, 6 7, 2, 0 3, 5, 5
  41. 41. Radix-sort 10/04/11 Didattica della Programmazione II 2° iterazione 720 329 436 839 355 457 657 <ul><li>La seconda operazione che deve eseguire RadixSort é quella di effettuare l'ordinamento, usando come chiave di ordinamento, la seconda cifra meno significativa </li></ul>For (i=1; i<=d; i++) i=2; d=3 7 2 0 3 5 5 4 3 6 4 5 7 6 5 7 3 2 9 8 3 9
  42. 42. Radix-sort 10/04/11 Didattica della Programmazione II 3° iterazione 329 355 436 457 657 720 839 <ul><li>La terza operazione che deve eseguire Radix-sort é quella di effettuare l'ordinamento, usando come chiave di ordinamento, la terza cifra meno significativa </li></ul>Dopo la 3° iterazione l’array è ordinato. For (i=1; i<=d; i++) i=3=d 7 2 0 329 4 3 6 839 355 457 657
  43. 43. 10/04/11 Didattica della Programmazione II Osserviamo che in questo caso, dato che i numeri interi presi in analisi sono composti da 3 cifre ciascuno, sono sufficienti 3 passaggi per ottenere un ordine definitivo. Analisi del Radix-sort Quindi, in un array contenente n numeri interi composti ognuno di d cifre, occorrono d passaggi per ordinare completamente il vettore. Radix-Sort(A:Vettore; d: int) For (i=1; i<=d; i++) Usa un algoritmo di ordinamento stabile per ordinare il vettore A sulla cifra i. For (i=1; i<=d; i++) Il tempo di esecuzione dipende dall’algoritmo di ordinamento stabile scelto per ordinare le singole cifre • se si usa il Counting Sort si ha che per ognuna delle d cifre si impiega un tempo  (k+n) pertanto si ha  (dk+dn) se d è una costante rispetto a n e se k=  (n) allora per il Radix-sort si ha  (n) Il Counting Sort si basa sull’ipotesi che ognuno degli n elementi in ingresso sia: un intero nell’intervallo da 1 a k Usa un algoritmo di ordinamento stabile per ordinare il vettore A sulla cifra i.
  44. 44. 10/04/11 Didattica della Programmazione II <ul><ul><li>L’ordine dei numeri non influisce sulle prestazioni dell’algoritmo. Il tempo necessario all'ordinamento cresce in modo lineare al crescere di n, dove n rappresenta la quantità dei numeri da ordinare. </li></ul></ul>Analisi del Radix-sort Dato che questo algoritmo per ordinare l'insieme dei dati non utilizza metodi basati sul confronto e lo scambio, l'ordine dei numeri in input influisce sulle prestazioni dell'algoritmo?

×