image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Isadora Ariane
Isadora Ariane16/11/2024 10:04
Compartilhe

TOP 25 ALGORITMOS | Heap Sort

  • #Estrutura de dados

É uma técnica de classificação baseada em comparação baseada na Binary Heap Data Structure. Pode ser vista como uma otimização sobre a classificação por seleção, onde primeiro encontramos o elemento máximo (ou mínimo) e o trocamos com o último (ou primeiro). Repetimos o mesmo processo para os elementos restantes.

📁 | Resumo

image

image

image

🤖 | Código


function heapify(arr, n, i) {

  // Inicializa o maior como raiz
  let largest = i;
  
  // Index da esquerda = 2*i + 1
  let l = 2 * i + 1; 
  
  // Index da direita = 2*i + 2
  let r = 2 * i + 2; 

  // Se o filho da esquerda for maior que a raiz
  if (l < n && arr[l] > arr[largest]) {
      largest = l;
  }

  // Se o filho da direita for maior que o largest até agora
  if (r < n && arr[r] > arr[largest]) {
      largest = r;
  }

  // Se o maior não for raiz
  if (largest !== i) {
      let temp = arr[i]; // Swap
      arr[i] = arr[largest];
      arr[largest] = temp;

      // Heapificar recursivamente a subárvore afetada
      heapify(arr, n, largest);
  }
}

// Função principal para fazer heap sort
function heapSort(arr) {
  let n = arr.length;

  // Construir heap (rearrange array)
  for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
      heapify(arr, n, i);
  }

  // Extrai um por um um elemento do heap
  for (let i = n - 1; i > 0; i--) {
  
      // Mover a raiz atual para o fim
      let temp = arr[0];
      arr[0] = arr[i];
      arr[i] = temp;

      // Chama max heapify no heap reduzido
      heapify(arr, i, 0);
  }
}

// Uma função utilitária para imprimir um array de tamanho n
function printArray(arr) {
  for (let i = 0; i < arr.length; i++) {
      console.log(arr[i] + " ");
  }
  console.log();
}

🕰️ | Complexidade de Tempo

O tempo de execução do algoritmo cresce em função do tamanho da entrada n multiplicado pelo logaritmo de n. Esse tipo de complexidade geralmente aparece em algoritmos que combinam operações lineares com alguma forma de divisão e conquista. Logo, sua complexidade de tempo será descrita por O(n ∙ log(n)).

📦 | Complexidade de Espaço

A quantidade de memória que um algoritmo usa cresce de forma logarítmica em relação ao tamanho da entrada n. Isso significa que, mesmo que a entrada n aumente significativamente, o espaço adicional necessário cresce lentamente. Logo, sua complexidade de espaço será descrita por O(log(n)).

✔️ | Vantagens

✦ Rápido, econômico e simples;

❌ | Desvantagens

✦ Instabilidade e ineficiência;

Compartilhe
Comentários (0)