DevPath · Aprenda a programar ESPTEN

Algoritmos e complexidade

Ordenação e recursão

Ordenação

Bubble sort — O(n²)

O mais simples de entender: compara pares adjacentes e os troca se estiverem na ordem incorreta, repetindo até que não haja mudanças.

function bubbleSort(arr) {
  const a = [...arr];
  for (let i = 0; i < a.length; i++) {
    for (let j = 0; j < a.length - 1 - i; j++) {
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]];
      }
    }
  }
  return a;
}

Merge sort e quick sort — O(n log n)

Para dados grandes, usam-se algoritmos de dividir para conquistar:

Ambos são muito mais rápidos que o bubble sort para entradas grandes. Na prática, Array.prototype.sort() já usa um algoritmo eficiente.

Recursão

Uma função recursiva chama a si mesma com um problema menor até chegar a um caso base.

function factorial(n) {
  if (n <= 1) return 1;       // caso base
  return n * factorial(n - 1); // caso recursivo
}

function fibonacci(n) {
  if (n < 2) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

O fibonacci recursivo ingênuo é O(2ⁿ): recalcula os mesmos valores uma e outra vez. Pode ser otimizado com memoização ou com um laço.

Exemplos

Bubble sort com rastreamento

function bubbleSort(arr) {
  const a = [...arr];
  for (let i = 0; i < a.length; i++) {
    for (let j = 0; j < a.length - 1 - i; j++) {
      if (a[j] > a[j + 1]) [a[j], a[j + 1]] = [a[j + 1], a[j]];
    }
  }
  return a;
}
console.log(bubbleSort([5, 2, 8, 1, 9, 3]));

Fatorial recursivo

function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
}
console.log("5! =", factorial(5));
Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
← Busca linear e bináriaMerge sort em detalhe →