Programmazione Algoritmi di ordinamento Alessandra Raffaetà Università Ca’ Foscari Venezia Corso di Laurea in Informatica Problema dell’ordinamento Input: sequenza di N elementi <a1, …, aN> Output: permutazione <ai1,…, aiN> tale che se k < h allora minore(ak,ah). Algoritmi basati sul confronto: □Insertion sort. □Selection sort. □Bubble sort. □Merge sort. Insertion sort Algoritmo di tipo incrementale. Idea: ordinamento delle carte da gioco. Partendo con la mano sinistra vuota e le carte sul tavolo, si preleva una carta alla volta dal tavolo e si inserisce in posizione corretta nella mano sinistra (cioè mantenendo le carte in mano ordinate). ordinata ? i ordinata ? Si inserisce nel sottoarray ordinato [0..i-1] l’elemento di indice i mantenendo ordinato il sottoarray [0..i] Insertion sort void insertionSort (TipoElem v[ ], int dim) { int ind_sist, /* indice dell’elemento da sistemare */ ind_contr; /* indice dell’elemento da controllare */ TipoElem val_sist; /* valore dell’elemento da sistemare */ for (ind_sist = 1; ind_sist < dim; ind_sist++){ val_sist = v[ind_sist]; /* controlla e sposta gli elem partendo dall’ultimo elem sistemato */ } } ind_contr = ind_sist - 1; while (ind_contr >= 0 && maggiore(v[ind_contr], val_sist)) { v[ind_contr + 1] = v[ind_contr]; ind_contr --; } v[ind_contr + 1] = val_sist; Invariante ciclo esterno dell’Insertion sort Inv ≡ all’inizio di ogni iterazione del for il sottoarray v[0, ind_sist) consiste degli elementi originariamente in v[0, ind_sist) ma ordinati. Selection sort Idea: estrazioni successive del minimo. Si cerca il più piccolo elemento dell’array e lo si scambia con l’elemento di indice 0, quindi si cerca in [1..dim-1] il più piccolo e lo si scambia con l’elemento di indice 1 e così via. ordinata v a l m i n ordinata m i n v a l Selection sort void selectionSort (TipoElem v[ ], int dim) { /* indice elemento minimo */ int i, j, i_min; TipoElem temp; for (i = 0; i < dim – 1; i++){ /* ricerca indice elemento minimo in v[i, dim-1] */ i_min = i; for (j = i+1; j < dim; j++) if (minore(v[j], v[i_min]) i_min = j; if (i != i_min) swap(v, i, i_min); } } Invariante ciclo esterno del selection sort Inv ≡ i∈ [0, dim - 1] ∧ v[0, i) ordinato ∧ ∀ k ∈[0, i). v[k] ≤ALL v[i, dim) Bubblesort Idea: Due elementi adiacenti si scambiano posizione in modo che quello più piccolo si sposti verso l’inizio dell’array. □ Ad ogni passaggio l’elemento più piccolo si muove da destra a sinistra fluttuando come una bolla verso l’inizio dell’array. Ottimizzazione: Se in un passaggio non è stato effettuato nessuno scambio l’array è ordinato. Bubblesort void bubblesort(TipoElem v[ ], int dim) { int i = 0, j, ordinato = 0; TipoElem temp; do { ordinato = 1; for (j = dim – 1; j > i; j --) if (maggiore(v[j - 1], v[j])) { /*elemento più piccolo galleggia verso l’alto*/ swap(v, j, j - 1); ordinato = 0; } } i++; /* ordinato == 1 sse nessuno scambio è stato effettuato */ } while (i < dim – 1 && !ordinato); Invariante ciclo esterno del bubblesort Inv ≡ i∈ [0, dim - 1] ∧ v[0, i) ordinato ∧ ∀ k ∈[0, i). v[k] ≤ALL v[i, dim) ∧ (ordinato → v[i, dim) ordinato)