Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
teknopedia

teknopedia

teknopedia

teknopedia

teknopedia

teknopedia
teknopedia
teknopedia
teknopedia
teknopedia
teknopedia
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Heapsort - Teknopedia
Heapsort - Teknopedia
Niente fonti!
Questa voce o sezione sull'argomento programmazione non cita le fonti necessarie o quelle presenti sono insufficienti.

Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti.
Abbozzo
Questa voce sull'argomento programmazione è solo un abbozzo.
Contribuisci a migliorarla secondo le convenzioni di Teknopedia.
Heapsort
Esecuzione dell'algoritmo. In una prima fase la lista viene riordinata per rispettare l'heap. Poi viene mostrata brevemente la struttura dati binaria e in seguito la lista viene riordinata.
ClasseAlgoritmo di ordinamento
Struttura datiArray
Caso peggiore temporalmente O ( n l o g n ) {\displaystyle O(nlogn)} {\displaystyle O(nlogn)}
Caso ottimo temporalmente Ω ( n l o g n ) {\displaystyle \Omega (nlogn)} {\displaystyle \Omega (nlogn)}
Caso medio temporalmente Θ ( n l o g n ) {\displaystyle \Theta (nlogn)} {\displaystyle \Theta (nlogn)}
Caso peggiore spazialmente O ( n ) {\displaystyle O(n)} {\displaystyle O(n)} totale
O ( 1 ) {\displaystyle O(1)} {\displaystyle O(1)} ausiliario
OttimaleNo
Manuale

Lo heapsort è un algoritmo di ordinamento iterativo ed in-place proposto da Williams nel 1964, che si basa su strutture dati ausiliarie.

Per eseguire l'ordinamento utilizza una struttura chiamata heap, rappresentabile con un albero binario in cui tutti i nodi seguono una data proprietà, detta priorità. Esso è completo almeno fino al penultimo livello dell'albero (con le foglie sull'ultimo livello compattate a sinistra) e ad ogni nodo corrisponde uno ed un solo elemento.

In uno heap decrescente (utilizzato per ordinare ad esempio un array in senso crescente) ogni nodo padre contiene un valore maggiore o uguale a quello dei suoi due figli diretti, di conseguenza risulterà maggiore anche di tutti i nodi che si trovano nel sottoalbero di cui esso è la radice; questo non implica affatto che nodi a profondità maggiore contengano valori minori di quelli a profondità minore.

Quindi in ogni istante, in uno heap decrescente, la radice contiene il valore maggiore.

Questa struttura è molto usata, in particolare, per l'ordinamento di array.

Per comprendere meglio il funzionamento dell'algoritmo è bene capire che gli elementi che si trovano nella seconda metà dell'array rappresenteranno foglie dello heap e quindi esse saranno già al loro posto giusto; non vi è infatti alcun elemento dopo di esse.

Operazioni sugli heap

[modifica | modifica wikitesto]

Lo heap può essere rappresentato graficamente da un array. Dato ciò può essere utile conoscere come operare sullo heap in modo da conoscere il padre e i figli di un determinato elemento di indice i.

La funzione per calcolare l'elemento padre di i è A [ i 2 ] {\displaystyle A\left[{\frac {i}{2}}\right]} {\displaystyle A\left[{\frac {i}{2}}\right]}.

Per il calcolo del figlio sinistro è 2 i {\displaystyle 2i} {\displaystyle 2i} e per il destro è 2 i + 1 {\displaystyle 2i+1} {\displaystyle 2i+1}.

Un MaxHeap è uno heap binario se ogni elemento soddisfa la proprietà per cui ogni elemento è minore o uguale al nodo padre.

Ovvero, dato un array A, un indice i e la lunghezza n del vettore, dove i rappresenta l'indice di ogni elemento:

A [ i 2 ] ≥ A [ i ] {\displaystyle A\left[{\frac {i}{2}}\right]\geq A[i]} {\displaystyle A\left[{\frac {i}{2}}\right]\geq A[i]} per ogni 1 < i ≤ n {\displaystyle 1<i\leq n} {\displaystyle 1<i\leq n}

Un MinHeap, al contrario, deve soddisfare la seguente proprietà:

A [ i 2 ] ≤ A [ i ] {\displaystyle A\left[{\frac {i}{2}}\right]\leq A[i]} {\displaystyle A\left[{\frac {i}{2}}\right]\leq A[i]} per ogni 1 < i ≤ n {\displaystyle 1<i\leq n} {\displaystyle 1<i\leq n}

Determinare il massimo o il minimo elemento da una di queste due strutture è immediato, infatti il primo elemento A [ 1 ] {\displaystyle A[1]} {\displaystyle A[1]} è sempre il massimo o il minimo dello heap, a seconda della proprietà che si è utilizzata.

Descrizione dell'algoritmo

[modifica | modifica wikitesto]

Concettualmente, l'algoritmo funziona nel seguente modo:

  1. Si costruisce un array contenente n {\displaystyle n} {\displaystyle n} elementi da ordinare
  2. Si verifica che a [ i ] < a [ j ] {\displaystyle a[i]<a[j]} {\displaystyle a[i]<a[j]} per i > j {\displaystyle i>j} {\displaystyle i>j} e si effettua uno scambio di elementi; altrimenti si continua per i = i + 1 {\displaystyle i=i+1} {\displaystyle i=i+1}
  3. Il massimo viene scambiato con l'elemento in posizione i {\displaystyle i} {\displaystyle i}, per i = n − 1 {\displaystyle i=n-1} {\displaystyle i=n-1}
  4. Si ripete il precedente passo per i = i − 1 {\displaystyle i=i-1} {\displaystyle i=i-1}

Si può dimostrare che la complessità asintotica massima dello heap sort è O ( n log ⁡ n ) {\displaystyle O(n\log n)} {\displaystyle O(n\log n)}. Tuttavia, in generale (e soprattutto per array quasi ordinati) altri algoritmi con la medesima complessità asintotica, per esempio quick sort o merge sort, ottengono migliori prestazioni. Per array di piccole dimensioni è addirittura più veloce l'insertion sort nonostante abbia una complessità, nel caso peggiore, di O ( n 2 ) {\displaystyle O(n^{2})} {\displaystyle O(n^{2})}.

Variante di Floyd

[modifica | modifica wikitesto]

Nella costruzione della struttura heap mediante l'algoritmo heapsort, si confrontano il massimo dei figli portandoli alla radice: così si ha un risparmio sul numero di confronti da eseguire.

Altri progetti

[modifica | modifica wikitesto]

Altri progetti

  • Wikimedia Commons
  • Collabora a Wikimedia Commons Wikimedia Commons contiene immagini o altri file sull'heapsort

Collegamenti esterni

[modifica | modifica wikitesto]
  • (EN) Eric W. Weisstein, Heapsort, su MathWorld, Wolfram Research. Modifica su Wikidata
V · D · M
Algoritmi di ordinamento
TeoriaTeoria della complessità computazionale · Notazione O Grande · Array · Lista · Stack · Coda · Ordinamento comparativo · Ordinamento adattivo
Algoritmi a scambioBubble sort · Shaker sort · Odd-even sort · Comb sort · Gnome sort · Quicksort
Algoritmi di selezioneSelection sort · Heap sort · Smoothsort
Algoritmi ad inserimentoInsertion sort · Shell sort · Tree sort · Library sort · Patience sorting
Algoritmi a fusioneMerge sort · Timsort
Algoritmi non comparativiRadix sort · Bucket sort · Counting sort · Pigeonhole sort
Altri algoritmiRete di ordinamento · Ordinamento topologico · Ordinamento bitonico · Ordinamento delle frittelle
Algoritmi inefficientiStupid sort · Trippel sort
  Portale Informatica: accedi alle voci di Teknopedia che trattano di informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Heapsort&oldid=144320046"

  • Indonesia
  • English
  • Français
  • 日本語
  • Deutsch
  • Italiano
  • Español
  • Русский
  • فارسی
  • Polski
  • 中文
  • Nederlands
  • Português
  • العربية
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022