<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="pt" lang="pt">
<head>
<title>Heapsort</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Heapsort"/>
<meta name="wx_page_id" content="14002"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Heapsort" id="wxsec1"><h1 class="pagetitle" id="wx1">Heapsort</h1>

<p id="wx2">O <a href="/wpt/Algoritmo" title="Algoritmo" wx:linktype="known" wx:pagename="Algoritmo" wx:page_id="257" id="wx3">algoritmo</a> <b id="wx4">heapsort</b> é um <a href="/wpt/Algoritmo_de_ordena%C3%A7%C3%A3o" title="Algoritmo de ordenação" wx:linktype="known" wx:pagename="Algoritmo_de_ordenação" wx:page_id="106140" id="wx5">algoritmo de ordenação</a> generalista, e faz parte da família de algoritmos de <a href="/wpt/Ordena%C3%A7%C3%A3o_por_sele%C3%A7%C3%A3o" title="Ordenação por seleção" wx:linktype="known" wx:pagename="Ordenação_por_seleção" wx:page_id="303934" id="wx6">ordenação por seleção</a>. Foi desenvolvido em 1964 por <b id="wx7">Robert W. Floyd</b> e <b id="wx8">J.W.J. Williams</b>.</p>

<div id="wx_toc"/>

<a id="Defini.C3.A7.C3.A3o" name="Defini.C3.A7.C3.A3o"/>
<wx:section level="2" title="Definição" id="wxsec2"><h2 id="wx9">Definição</h2>

<p id="wx10">Tem um desempenho em tempo de execução muito bom em conjuntos ordenados aleatoriamente, tem um uso de memória bem comportado e o seu desempenho em <a href="/wpt/Complexidade_Pior_caso" title="Complexidade Pior caso" wx:linktype="known" wx:pagename="Complexidade_Pior_caso" wx:page_id="448232" id="wx11">pior cenário</a> é praticamente igual ao desempenho em <a href="/wpt/Complexidade_Caso_m%C3%A9dio" title="Complexidade Caso médio" wx:linktype="known" wx:pagename="Complexidade_Caso_médio" wx:page_id="448222" id="wx12">cenário médio</a>. Alguns algoritmos de ordenação rápidos têm desempenhos espectacularmente ruins no pior cenário, quer em tempo de execução, quer no uso da memória. O Heapsort trabalha no lugar e o tempo de execução em pior cenário para ordenar <i id="wx13">n</i> elementos é de <a href="/wpt/Nota%C3%A7%C3%A3o_O_mai%C3%BAsculo" title="Notação O maiúsculo" wx:linktype="known" wx:pagename="Notação_O_maiúsculo" wx:page_id="580128" id="wx14">O</a> (<i id="wx15">n</i> lg <i id="wx16">n</i>). Lê-se logaritmo de "n" na base 2. Para valores de <i id="wx17">n</i>, razoavelmente grande, o termo lg <i id="wx18">n</i> é quase constante, de modo que o tempo de ordenação é quase linear com o número de itens a ordenar.</p>

<a id="Caracter.C3.ADsticas" name="Caracter.C3.ADsticas"/>
</wx:section><wx:section level="2" title="Características" id="wxsec3"><h2 id="wx19">Características</h2>

<ul id="wx20">
<li id="wx21">
<p id="wx22">Comparações no pior caso: 2n log<sub id="wx23">2</sub>n + O(n) é o mesmo que 2n logn + O(n)</p>
</li>

<li id="wx24">
<p id="wx25">Trocas no pior caso: n log<sub id="wx26">2</sub>n + O(n) é o mesmo que n lgn + O(n)</p>
</li>

<li id="wx27">
<p id="wx28">Melhor e pior caso: O(n log<sub id="wx29">2</sub>n) é o mesmo que O(n lgn)</p>
</li>
</ul>

<a id="Funcionamento" name="Funcionamento"/>
</wx:section><wx:section level="2" title="Funcionamento" id="wxsec4"><h2 id="wx30">Funcionamento</h2>

<p id="wx31">O heapsort utiliza uma estrutura de dados chamada <a href="/wpt/Heap" title="Heap" wx:linktype="known" wx:pagename="Heap" wx:page_id="217568" id="wx32">heap</a> para ordenar os elementos a medida que os insere na estrutura. Assim, ao final das inserções, os elementos podem ser sucessivamente removidos da raiz da <a href="/wpt/Heap" title="Heap" wx:linktype="known" wx:pagename="Heap" wx:page_id="217568" id="wx33">heap</a>, na ordem desejada.</p>

<p id="wx34">A heap pode ser representada como uma árvore ou como um vetor. Para uma ordenação crescente, deve ser construído um heap máximo (o maior elemento fica na raiz). Para uma ordenação decrescente, deve ser construído um heap mínimo (o menor elemento fica na raiz).</p>

<a id="Implementa.C3.A7.C3.B5es" name="Implementa.C3.A7.C3.B5es"/>
</wx:section><wx:section level="2" title="Implementações" id="wxsec5"><h2 id="wx35">Implementações</h2>

<a id="Assembly_x86-gas-Linux" name="Assembly_x86-gas-Linux"/>
<wx:section level="3" title="Assembly x86-gas-Linux" id="wxsec7"><h3 id="wx36">Assembly x86-gas-Linux</h3>

<pre id="wx37">
/* void heap_sort_as(int *x, int n);*/
.globl heap_sort_as
heap_sort_as:
    pushl %ebp
    movl %esp, %ebp
    /* 8(%ebp) -&gt; arranjo*/  
    /* 12(%ebp) -&gt; num de elementos *4 */
    movl 12(%ebp), %eax
    movl $4, %ebx
    mul %ebx
    pushl %eax
    pushl 8(%ebp)   
    call montar_heap_as
    addl $4, %esp
    popl %eax       
    subl $4, %eax          /* eax eh (n*4)-4*/
    /* faz a troca */
    movl 8(%ebp), %ebx     /* tmp = *x */
    pushl %eax
    movl %ebx, %ecx
    addl %eax, %ecx
    movl (%ebx), %eax
    movl (%ecx), %edx
    movl %eax, (%ecx)
    movl %edx, (%ebx)
    popl %eax              /* eax representa (n*4)-4 */
    pushl $0
    pushl %eax
    pushl 8(%ebp)   
heap_sort_as_loop:
    cmp $1, %eax
    jle heap_sort_as_fim
    call man_heap_as
    movl 4(%esp), %eax
    subl $4, %eax
    /* faz a troca */
    movl 8(%ebp), %ebx     /* tmp = *x */
    pushl %eax
    movl %ebx, %ecx
    addl %eax, %ecx
    movl (%ebx), %eax
    movl (%ecx), %edx
    movl %eax, (%ecx)
    movl %edx, (%ebx)
    popl %eax              /* eax representa (n*4)-4 */
    movl %eax, 4(%esp)
    jmp heap_sort_as_loop
heap_sort_as_fim:
    leave
    ret
montar_heap_as:
    pushl %ebp
    movl %esp, %ebp
    /* 8(%ebp) -&gt; arranjo*/  
    /* 12(%ebp) -&gt; num de elementos *4 */
    movl 12(%ebp), %eax
    movl $2, %ecx
    cltd
    idivl %ecx
    movl $4, %ecx
    cltd
    idivl %ecx
    mul %ecx
    subl $4, %eax /* eax eh h*/
    pushl %eax
    pushl 12(%ebp)
    pushl 8(%ebp)   
montar_heap_as_whmz:
    cmp $0, %eax
    jl montar_heap_as_fim
    call man_heap_as
    movl 8(%esp), %eax
    subl $4, %eax
    movl %eax, 8(%esp)
    jmp montar_heap_as_whmz
montar_heap_as_fim:
    leave
    ret
man_heap_as:
    pushl %ebp
    movl %esp, %ebp
    /* 8(%ebp) -&gt; arranjo */
    /* 12(%ebp) -&gt; num de elementos *4 */    
    /* 16(%ebp) -&gt; pai *4 */
    movl 16(%ebp), %eax
    pushl %eax
    movl $2, %ebx
    mul %ebx
    addl $4, %eax             /* agora eax eh f*/
man_heap_as_wfmn:
    cmp 12(%ebp), %eax
    jge man_heap_as_fim
    movl %eax, %ebx
    addl $4, %ebx             /* ebx eh f2 */
    movl 8(%ebp),%edx
    addl %eax, %edx           /* edx aponta p/ x[f] */
    movl (%edx), %edx
    cmp 12(%ebp), %ebx
    jge man_heap_as_testetroca
    movl 8(%ebp), %ecx
    addl %ebx, %ecx          /* ecx aponta p/ x[f2] */
    movl (%ecx), %ecx
    cmp %edx, %ecx
    jle man_heap_as_testetroca
    movl %ebx, %eax          /* f=f2 ou seja maior filho eh f2 */
    movl %ecx, %edx          /* movimentacao apenas p/ testar */    
man_heap_as_testetroca:
    popl %ebx           /* ebx eh p */
    movl 8(%ebp), %ecx 
    addl %ebx, %ecx     /* ecx eh x[p]*/
    movl (%ecx), %ecx
    cmp %ecx, %edx
    jle man_heap_as_fim
    /*fazer a troca */  
    pushl %eax          /* salva f na pilha*/
    addl 8(%ebp), %eax
    movl %ecx, (%eax)   /* x[f] = x[p] */
    addl 8(%ebp), %ebx
    movl %edx, (%ebx)   /* x[p] = x[f] */   
    movl (%esp), %eax
    movl $2, %ebx
    mul %ebx
    addl $4, %eax
    jmp man_heap_as_wfmn
man_heap_as_fim:
    leave
    ret
</pre>

<a id="C.C3.B3digo_em_C" name="C.C3.B3digo_em_C"/>
</wx:section><wx:section level="3" title="Código em C" id="wxsec8"><h3 id="wx38">Código em C</h3>

<pre id="wx39">
void heapsort(tipo a[], int n)
{
   int i = n/2, pai, filho;
   tipo t;
 
   for (;;)
   {
      if (i &gt; 0)
      {
          i--;
          t = a[i];
      }
      else
      {
          n--;
          if (n == 0)
             return;
          t = a[n];
          a[n] = a[0];
      }
     
      pai = i;
      filho = i*2 + 1;
 
      while (filho &lt; n)
      {
          if ((filho + 1 &lt; n)  &amp;&amp;  (a[filho + 1] &gt; a[filho]))
              filho++;
          if (a[filho] &gt; t)
          {
             a[pai] = a[filho];
             pai = filho;
             filho = pai*2 + 1;
          }
          else
             break;
      }
      a[pai] = t;
   }
}
</pre>

<a id="C.C3.B3digo_em_C.2B.2B" name="C.C3.B3digo_em_C.2B.2B"/>
</wx:section><wx:section level="3" title="Código em C++" id="wxsec9"><h3 id="wx40">Código em C++</h3>

<pre id="wx41">
template&lt;class T&gt;
void heap_sort( std::vector&lt;T&gt; &amp;lista )
{  
    int tam = static_cast&lt;int&gt;( lista.size() ), i;

    for( i = tam/2 - 1; i &gt;= 0; --i )
    {
       maxHeapify(lista, i , tam );
    }

    std::vector&lt;T&gt;::reverse_iterator elem;

    for( elem = lista.rbegin(); elem != lista.rend(); elem++ )
    {
       std::iter_swap( elem, lista.begin() );
       maxHeapify( lista, 0, --tam );
    }
}

template&lt;class T&gt;
void maxHeapify( std::vector&lt;T&gt; &amp;lista, const int pos, const int n ) 
{ 
    int max = 2 * pos + 1;

    if( max &lt; n )
    { 
       if( (max+1) &lt; n &amp;&amp; lista.at(max) &lt; lista.at(max+1) )
       {
          ++max;
       }
       if( lista.at(max) &gt; lista.at(pos) ) 
       { 
          std::swap( lista[max], lista[pos] );
          maxHeapify( lista, max, n );
       }
    }
}
</pre>

<a id="C.C3.B3digo_em_Java" name="C.C3.B3digo_em_Java"/>
</wx:section><wx:section level="3" title="Código em Java" id="wxsec10"><h3 id="wx42">Código em Java</h3>

<pre id="wx43">
       public static void heapSort(int v [])
       {  
         buildMaxHeap(v);
         int n = v.length;

         for (int i = v.length - 1; i &gt; 0; i--) 
         { 
            swap(v, i , 0);
            maxHeapify(v, 0, --n);
         }
       }
       private static void buildMaxHeap(int v[])
       { 
          for (int i = v.length/2 - 1; i &gt;= 0; i--)
             maxHeapify(v, i , v. length );
       }
       private static void maxHeapify(int v [], int pos, int n) 
       { 
          int max = 2 * pos + 1, right = max + 1;
          if (max &lt; n)
          { 
             if ( right &lt; n &amp;&amp; v[max] &lt; v[right])
                max = right;
             if (v[max] &gt; v[pos]) 
             { 
                swap(v, max, pos);
                maxHeapify(v, max, n);
             }
          }
       }

       public static void swap ( int [ ] v, int j, int aposJ )
       {
          int aux = 0;
          aux = v [ j ];
          v [ j ] = v [ aposJ ];
          v [ aposJ ] = aux;
       }
</pre>

<a id="C.C3.B3digo_em_Java_.285.0.29" name="C.C3.B3digo_em_Java_.285.0.29"/>
</wx:section><wx:section level="3" title="Código em Java (5.0)" id="wxsec11"><h3 id="wx44">Código em Java (5.0)</h3>

<pre id="wx45">
    public static &lt;T extends Comparable&lt;T&gt;&gt; void heapSort(T[] v) {
        buildMaxHeap(v);
        int n = v.length;

        for (int i = v.length - 1; i &gt; 0; i--) {
            swap(v, i, 0);
            maxHeapify(v, 0, --n);
        }
    }

    private static &lt;T extends Comparable&lt;T&gt;&gt; void buildMaxHeap(T v[]) {
        for (int i = v.length / 2 - 1; i &gt;= 0; i--)
            maxHeapify(v, i, v.length);
    }

    private static &lt;T extends Comparable&lt;T&gt;&gt; void maxHeapify(T[] v, int pos,
            int n) {
        int max = 2 * pos + 1, right = max + 1;
        if (max &lt; n) {
            if (right &lt; n &amp;&amp; v[max].compareTo(v[right]) &lt; 0)
                max = right;
            if (v[max].compareTo(v[pos]) &gt; 0) {
                swap(v, max, pos);
                maxHeapify(v, max, n);
            }
        }
    }

    public static &lt;T extends Comparable&lt;T&gt;&gt; void swap(T[] v, int j, int aposJ) {
        T aux;
        aux = v[j];
        v[j] = v[aposJ];
        v[aposJ] = aux;
    }
</pre>

<a id="Liga.C3.A7.C3.B5es_externas" name="Liga.C3.A7.C3.B5es_externas"/>
</wx:section></wx:section><wx:section level="2" title="Ligações externas" id="wxsec6"><h2 id="wx46"><wx:template id="wx_t1" pagename="Predefinição:Links_externos" page_id="917352"/>Ligações externas<wx:templateend start="wx_t1"/></h2>

<ul id="wx47">
<li id="wx48"><a href="http://c2.com/cgi/wiki?HeapSort" class="external text" wx:linktype="external" rel="nofollow" id="wx49">HeapSort</a></li>

<li id="wx50">
<p id="wx51">(<a href="http://www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html" class="external free" wx:linktype="external" rel="nofollow" id="wx52">http://www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html</a>)</p>
</li>

<li id="wx53"><a href="http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html" class="external text" wx:linktype="external" rel="nofollow" id="wx54"><i id="wx55">Animação do processo de ordenação pelo Heapsort</i></a></li>

<li id="wx56"><a href="http://www.datastructures.info/what-is-heap-sort-and-how-does-it-work-heap-sort-algorithm/" class="external text" wx:linktype="external" rel="nofollow" id="wx57">Heapsort in C++</a></li>

<li id="wx58"><a href="http://www.algorithm-code.com/wiki/Heapsort" class="external text" wx:linktype="external" rel="nofollow" id="wx59">Heapsort code</a></li>
</ul>

<wx:template id="wx_t2" pagename="Predefinição:Esboço-prog" page_id="221358"/>
<table align="center" cellpadding="0" cellspacing="0" style="background-color: white; border: 1px solid #ccc; padding: 5px; font-size:85%;" class="noprint" id="wx60">
<tr id="wx61">
<td id="wx62"><a href="/wpt/Imagem:Singleton.png" title="" wx:linktype="image" wx:pagename="Imagem:Singleton.png" id="wx63"><img src="/wpt/Imagem:Singleton.png" alt="" width="50" id="wx64"/></a> </td>
<td id="wx65">
<p id="wx66">  <i id="wx67">Este artigo é um <a href="/wpt/Wikipedia:Esbo%C3%A7o" title="Wikipedia:Esboço" wx:linktype="known" wx:pagename="Wikipedia:Esboço" id="wx68">esboço</a> sobre <b id="wx69"><a href="/wpt/Programa%C3%A7%C3%A3o" title="Programação" wx:linktype="known" wx:pagename="Programação" wx:page_id="7329" id="wx70">Programação</a></b>. Pode ajudar a Wikipédia <span class="plainlinks" id="wx71"><a href="http://wpt/wpt/index.php?title=Heapsort&amp;action=edit" class="external text" wx:linktype="external" rel="nofollow" id="wx72">expandindo-o</a></span>.</i></p>
</td>
</tr>
</table>

<p id="wx73"><br id="wx74"/>
</p>

<wx:templateend start="wx_t2"/>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wpt/index.php?title=Especial:Categories&amp;article=Heapsort" title="Especial:Categories" wx:linktype="known" wx:pagename="Especial:Categories" id="wx75">Categorias de páginas</a>: <span dir="ltr" id="wx76"><a href="/wpt/Categoria:%21Esbo%C3%A7os_sobre_programa%C3%A7%C3%A3o" title="Categoria:!Esboços sobre programação" wx:linktype="known" wx:pagename="Categoria:!Esboços_sobre_programação" wx:page_id="123086" id="wx77">!Esboços sobre programação</a></span> | <span dir="ltr" id="wx78"><a href="/wpt/Categoria:Algoritmos_de_ordena%C3%A7%C3%A3o" title="Categoria:Algoritmos de ordenação" wx:linktype="known" wx:pagename="Categoria:Algoritmos_de_ordenação" wx:page_id="44911" id="wx79">Algoritmos de ordenação</a></span></div>
<div id="wx_languagelinks">
Outras línguas: <a href="http://cs.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="cs:Heapsort" id="wx80">Česky</a> | <a href="http://de.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="de:Heapsort" id="wx81">Deutsch</a> | <a href="http://en.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="en:Heapsort" id="wx82">English</a> | <a href="http://es.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="es:Heapsort" id="wx83">Español</a> | <a href="http://fr.wikipedia.org/wiki/Tri_par_tas" class="external" wx:linktype="interwiki" wx:pagename="fr:Tri_par_tas" id="wx84">Français</a> | <a href="http://he.wikipedia.org/wiki/%D7%9E%D7%99%D7%95%D7%9F_%D7%A2%D7%A8%D7%99%D7%9E%D7%94" class="external" wx:linktype="interwiki" wx:pagename="he:מיון_ערימה" id="wx85">עברית</a> | <a href="http://is.wikipedia.org/wiki/Hr%C3%BAgur%C3%B6%C3%B0un" class="external" wx:linktype="interwiki" wx:pagename="is:Hrúguröðun" id="wx86">Íslenska</a> | <a href="http://it.wikipedia.org/wiki/Heap_sort" class="external" wx:linktype="interwiki" wx:pagename="it:Heap_sort" id="wx87">Italiano</a> | <a href="http://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%83%97%E3%82%BD%E3%83%BC%E3%83%88" class="external" wx:linktype="interwiki" wx:pagename="ja:ヒープソート" id="wx88">日本語</a> | <a href="http://lb.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="lb:Heapsort" id="wx89">Lëtzebuergesch</a> | <a href="http://lt.wikipedia.org/wiki/Kr%C5%ABvos_rikiavimo_algoritmas" class="external" wx:linktype="interwiki" wx:pagename="lt:Krūvos_rikiavimo_algoritmas" id="wx90">Lietuvių</a> | <a href="http://nl.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="nl:Heapsort" id="wx91">Nederlands</a> | <a href="http://no.wikipedia.org/wiki/Heapsort" class="external" wx:linktype="interwiki" wx:pagename="no:Heapsort" id="wx92">Norsk (bokmål)</a> | <a href="http://pl.wikipedia.org/wiki/Sortowanie_przez_kopcowanie" class="external" wx:linktype="interwiki" wx:pagename="pl:Sortowanie_przez_kopcowanie" id="wx93">Polski</a> | <a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%80%D0%B0%D0%BC%D0%B8%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0" class="external" wx:linktype="interwiki" wx:pagename="ru:Пирамидальная_сортировка" id="wx94">Русский</a> | <a href="http://tr.wikipedia.org/wiki/Y%C4%B1%C4%9F%C4%B1n_s%C4%B1ralamas%C4%B1" class="external" wx:linktype="interwiki" wx:pagename="tr:Yığın_sıralaması" id="wx95">Türkçe</a> | <a href="http://vi.wikipedia.org/wiki/S%E1%BA%AFp_x%E1%BA%BFp_vun_%C4%91%E1%BB%91ng" class="external" wx:linktype="interwiki" wx:pagename="vi:Sắp_xếp_vun_đống" id="wx96">Tiếng Việt</a> | <a href="http://zh.wikipedia.org/wiki/%E5%A0%86%E7%A9%8D%E6%8E%92%E5%BA%8F" class="external" wx:linktype="interwiki" wx:pagename="zh:堆積排序" id="wx97">中文</a></div>
</body>
<wx:templatearguments for="wx_t1"><wx:argument name=""/></wx:templatearguments>
<wx:templatearguments for="wx_t2"><wx:argument name=""/></wx:templatearguments>
</html>
