E14: Heap e Heapsort

E14.1  Critique a seguinte ideia: para transformar um vetor arbitrário em heap, basta colocá-lo em ordem decrescente.

E14.2  Suponha que v[1..m] é um heap e que os elementos do vetor são distintos dois a dois (ou seja, diferentes entre si).  É claro que o maior elemento do vetor está no índice 1.  Onde pode estar o segundo maior elemento?  Onde pode estar o terceiro maior elemento?

E14.3  O fragmento de programa abaixo transforma um vetor arbitrário v[1..m] em heap?

for (p = 1; p <= m/2; ++p)  peneira (p, m, v);

E14.4  Use o Heapsort para rearranjar o vetor  16 15 14 13 12 11 10 9 8 7 6 5 4  em ordem crescente.

E14.5  Escreva uma função ff que receba um vetor v[1..k] tal que v[1..k-1]  é um heap e transforme  v[1..k]  em heap. Sua função deve fazer no máximo  2 log k  comparações entre elementos do vetor.  (Esse tipo de função é conhecido como FixUp ou Swim.)

Depois, use ff para construir uma função que transforme qualquer vetor v[1..m] em heap. Sua função deve fazer no máximo  2 m log m  comparações entre elementos do vetor.