Questa lezione ha come oggetto l'algoritmo di ordinamento SelectSort.
Sia S una sequenza di n numeri distinti. Dato 1 <= i <= n e un elemento x di S, diremo che x è l'elemento di ordine i di S se esistono i-1 elementi in S più piccoli di x. In particolare, l'elemento di ordine 1 è detto minimo di S, l'elemento di ordine n è detto massimo di S, e l'elemento di ordine (n+1) div 2 (divisione intera) è detto mediana di S. Il problema della selezione è il seguente: dati in ingresso una sequenza S di n numeri distinti e un indice 1 <= i <= n, fornire in uscita l'elemento di ordine i di S.
Un algoritmo che risolve il problema della selezione con complessità lineare è il seguente:
Select(A,p,r,i) // Uso un vettore B[1, ... , (length(A) div 5) + 1] // p <= r, 1 <= i <= r-p+1 // Inizio Parte I IF (p = r) return A[p] ENDIF n = r-p+1 FOR (j = 1 to n div 5) MergeSort(A, p+5*(j-1), p+5*j-1) ENDFOR IF ((n mod 5) != 0) MergeSort(A, p+5*j, r) ENDIF // Inizio Parte II FOR (j = 1 to n div 5) B[j] = A[p + (j-1)*5 + 2] ENDFOR IF ((n mod 5) != 0) q = p+5*j B[j+1] = A[q + (r-q) div 2 ] ENDIF // Inizio Parte III m = (n div 5) + 1 x = Select(B,1,m, (m+1) div 2 ) // Inizio Parte IV j = ArraySearch(A,p,r,x) Exchange(A,j,r) k = Partition(A,p,r) // Inizio Parte V IF (i = k) return x ELSE IF (i < k) Select(A,p,k-1,i) ELSE Select(A,k+1,r,i-k) ENDIF ENDIF
Il metodo di ordinamento SelectSort consiste nella seguente variante dell'algoritmo QuickSort:
SelectSort(A,p,r) IF (p < r) n = r-p+1 x = Select(A, p, r, (n+1) div 2) i = IndexOf(A,p,r,x) Exchange(A, i, r) q = Partition(A, p, r) SelectSort(A, p, q-1) SelectSort(A, q+1, r) ENDIF
dove il metodo Select(A,p,r,i) trova l'elemento di ordine i cercando in A[p...r] e il metodo IndexOf(A,p,r,x) restituisce l'indice dell'elemento x cercando in A[p...r].
Scrivere una classe SelectSort che ordina, in senso crescente, un vettore casuale di interi usando il metodo SelectSort. Aggiornare la classe SortWorkBench con l'algoritmo SelectSort.