Sei sulla pagina 1di 7

21/10/2009

21/10/2009

// Ordinamento decrescente

10

8 7 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 5 9 6 7 8 5 6 9

7 8 5 6 9 7 5 8 6 9 7 5 6 8 9

7 5 6 8 9 5 7 6 8 9 5 6 7 8 9

5 6 7 8 9

11

12

21/10/2009

5 7 4 9 6
l'insieme ordinato key l'insieme ordinato viene mantenuto nelle posizioni da [0..i] ad ogni iterazione inserisce il primo elemento dellinsieme non ordinato (key) in posizione ordinata nel vettore ordinato.

. . . . . . . . . . .

4 5 7 9 6
l'insieme ordinato

13

14

l'insieme ordinato viene mantenuto nelle posizioni da [0..i] ad ogni iterazione inserisce l'elemento key in posizione ordinata nel vettore ordinato. Partendo dal fondo fa un confronto tra elementi. Se l'elemento cercato e' maggiore di quello da inserire lo si sposta in avanti, altrimenti si e' trovata la posizione corretta e key viene inserito

8 7 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 5 9 6 7 5 8 9 6 5 7 8 9 6

7 9 5

key key key

5 7 8 9 6 5 7 8 6 9 5 7 6 8 9 5 6 7 8 9
for (i=1; i<n; i++) {

key

key = v[i]; for (j=i; j>0; j--) if (basecmp(v[j-1],key) == 1) v[j] = v[j-1]; else break; v[j] = key; }

15

16

k contiene l'indice dell'elemento minore del vettore v[i..n-1]. Questo va inserito in posizione i

. . . . .

17

18

21/10/2009

8 7 9 5 6 5 7 9 8 6 5 6 9 8 7 5 6 7 8 9

19

20

9 8 7 9 5 6 2 2 6 2

21

22

La funzione
siftDown()

(ri)costruisce lheap.

23

24

21/10/2009

for (i = (array_size / 2)-1; i >= 0; i--)

Dimensione = 5
0 1 2 3 4 0 1 2 3 4

siftDown(v, i, array_size-1);

Dimensione = 5

Elemento pi grande dellheap

8 7 9 5 6

8 7 9 5 6
0 1 2 3 4

9 8 7 5 6 6 8 7 5 9
for (i = array_size-1; i >= 1; i--) { swap(v,0,i); siftDown(v, 0, i-1); }

8 9 7 5 6
0 1 2 3 4 0 1 2 3 4

8 7 6 5 9 5 7 6 8 9 7 6 5 8 9 5 6 7 8 9

8 9 7 5 6

8 9 7 5 6
0 1 2 3 4

9 8 7 5 6

25

26

27

28

ciclo di fusione fino ad esurimento di una sottosequenza

8 7 9 5 6 4

8 7 9

5 6 4

8 7
completamento della fusione con il resto della sottosequenza non ancora esurita

9 5

5 6 6

copia la sequenza ordinata dal vettore ausiliario in v

29

30

21/10/2009

7 8 9 5 6 4

7 8 9 5 6 4

7 8 9

5 6 4

7 8 9

5 6 4

7 8 8 7

9 5

5 6 6

4 8

7 8 7

9 5

5 6 6

31

32

4 5 6 7 8 9 7 8 9 4 5 6

7 8 9

4 5 6

7 8 8 7

9 5

5 6 6

4
(pivot)

12 4 5 87 11 2 6 45
Divisione dellarray

2 4 5 6 11 12 87 45

33

34

35

36

21/10/2009

PARTITION (sul vettore iniziale)


pivot
while (down < up)

.
lb

.
ub

lb(pivot)

ub

{ while(basecmp(v[down],pivot)<=0 down++; while(basecmp(v[up],pivot) == 1) up--; if (down < up) && down<ub)

12 4 5 87 11 2 6 45
down up

12 4 5 87 11 2 6 45
Swap di down e up

swap(v,down,up); }

12 4 5 6 11 2 87 45
down = up

12 4 5 6 11 2 87 45
Swap di pivot e up

swap(v,lb,up);

2 4 5 6 11 12 87 45

37

38

Nome Bubble Sort Insertion Sort Selection Sort Heap Sort Merge Sort Quick Sort

Caso Migliore O(n) O(n) O(n2) O(n log n) O(n log n) O(n log n)

Caso Medio O(n2) O(n2) O(n2) O(n log n) O(n log n) O(n log n)

Caso Peggiore O(n2) O(n2) O(n2) O(n log n) O(n log n) O(n2)

Memoria O(1) O(1) O(1) O(1) O(n) O(log n)

Stabile? S S S No S No

Fonte: http://it.wikipedia.org/wiki/Algoritmi_di_ordinamento 39

Potrebbero piacerti anche