Algoritmi di ordinamento con ASP

3 pagine in totale: <<Indietro 1 2 [3]

Dall'Inghilterra con furore

Un altro algoritmo generalmente noto è il QuickSort , la cui felice e fortunata scoperta è dovuta ad un ricercatore inglese, Sir Tony Hoare. Questo è un tipo di algoritmo molto efficiente che segue la logica divide and conquer per ordinare un gruppo di elementi.

Anche se vi sono diverse varianti del QuickSort le fasi generalmente utilizzate sono:

  • Selezione di un elemento della lista. Questo verrà utilizzato come elemento cardine ( pivot ) durante l'esecuzione
  • Scansione della lista al fine di collocare gli elementi maggiori del pivot alla sua destra e quelli minori alla sua sinistra. Anche in questo caso lo spostamento avviene tramite scambio o swap degli elementi

  • Divisione della lista in due parti: una (sinistra) con gli elementi minori del pivot e l'altra con gli elementi più grandi
  • Ripetizioni delle tre fasi su ogni sotto-lista fino a quando tutti gli elementi non sono in ordine

In questo esempio verranno utilizzati il pivot centrale (potrebbe essere fisso su una posizione o selezionato a caso) e la tecnica della ricorsione (anche se questo è lo standard vi sono implementazioni che non utilizzano la ricorsione).

sub quickSort(byVal primoElemento,byVal ultimoElemento)

  dim limiteInferiore,limiteSuperiore, separatoreMediano

  limiteInferiore = primoElemento
  limiteSuperiore = ultimoElemento

  separatoreMediano =arrayRandom((primoElemento + ultimoElemento) / 2)

  do

   'tutti gli elementi a sinistra del mediano dovrebbero essere di valore inferiore
   'quindi trova la posizione del primo elemento con valore maggiore del mediano
   'tra quelli alla sua sinistra

   while arrayRandom(limiteInferiore) < separatoreMediano
     limiteInferiore = limiteInferiore + 1
   wend

   'tutti gli elementi a destra del mediano dovrebbero essere di valore maggiore
   'quindi trova la posizione del primo elemento con valore inferiore del mediano
   'tra quelli alla sua destra

   while (arrayRandom(limiteSuperiore) > separatoreMediano)
     limiteSuperiore = limiteSuperiore - 1
   wend

   'se il limiteInferiore è minore del superiore scambia gli elementi

   if limiteInferiore <= limiteSuperiore Then

     if limiteInferiore < limiteSuperiore Then
      call invertiValore(limiteInferiore, limiteSuperiore)
     end if

     'incrementa/decrementa i limiti
     limiteInferiore = limiteInferiore + 1
     limiteSuperiore = limiteSuperiore - 1

   end if

  'esce dal ciclo quando il limite inferiore è più grande del maggiore
  loop while (limiteInferiore <= limiteSuperiore)

  if primoElemento < limiteSuperiore Then
   call quickSort(primoElemento, limiteSuperiore)
  end if

  if limiteInferiore < ultimoElemento Then
   call quickSort(limiteInferiore, ultimoElemento)
  end if

end sub

Veloce ma consuma!

In genere il QuickSort è molto efficiente con una misurazione media di passaggi uguale a O(n log n) ma se il gruppo di elementi è quasi in ordine all'inizio la sua performance non è eccezionale, specialmente se si utilizza un pivot corrispondente alla testa di ogni lista. Nel peggiore dei casi può arrivare a O(n2), come l'Insertion Sort o forse addirittura come il 'primitivo' BubbleSort!

Spesso conviene utilizzare il QuickSort per ordinare grandi gruppi di elementi, ma bisogna non dimenticare comunque che la tecnica delle ricorsione da esso ampiamente utilizzata può catastroficamente consumare lo spazio di stack in condizioni limite.

Per finire

Un suggerimento valido per chi voglia utilizzare in situazioni reali gli algoritmi allegati è quello di rimuovere le variabili che misurano il numero di scambi e di comparazioni, poichè la loro presenza nel codice riduce notevolmente la performance del codice. Un semplice incremento di variabile come il seguente

miaVariabile = miaVariabile + 1

in VBScript causa rallentamenti del codice poichè questo linguaggio non può utilizzare niente di meglio del tipo variant , anche quando un integer sarebbe piu` efficiente. A questo si aggiunga che le variabili in questione sono globali.

Ci sono molti altri algoritmi che vale la pena di analizzare. Nel frattempo potrebbe valer la pena di iniziare a dare un'occhiata in giro per il web dove si possono trovare maggiori informazioni, altri test, misurazioni più sofisticate e alcune utili applet per visualizzare concretamente l'azione dell'ordinamento.

Approfondimenti

3 pagine in totale: <<Indietro 1 2 [3]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC