Inicio > Cursos > Algoritmos > Algoritmos de Ordenamiento
AlgoritmosAlgoritmos de Ordenamiento y BúsquedaLección 9 de 19

Algoritmos de Ordenamiento

Los algoritmos de ordenamiento ilustran perfectamente cómo la complejidad afecta el rendimiento real. Bubble Sort y Insertion Sort son O(n²): simples de entender pero inutilizables para datos grandes. Merge Sort divide recursivamente el array a la mitad, ordena cada mitad y las fusiona: siempre O(n log n) pero usa O(n) de memoria extra.

Quick Sort elige un pivote y divide el array en "menores" y "mayores": O(n log n) promedio, O(n²) en el peor caso, pero O(log n) de espacio.

Comprender Merge Sort es fundamental porque el patrón "divide y conquista" que usa aparece en decenas de otros algoritmos. La idea: dividir el problema en dos mitades más pequeñas, resolver cada mitad recursivamente, y combinar los resultados.

También te enseña el árbol de recursión para calcular complejidad: si cada nivel hace O(n) trabajo y hay O(log n) niveles, la complejidad total es O(n log n). Los lenguajes modernos usan TimSort (híbrido de Merge Sort e Insertion Sort) en sus métodos sort() nativos.

// Merge Sort - O(n log n) tiempo, O(n) espacio
// Divide y vencerás
function mergeSort(arr) {
  if (arr.length <= 1) return arr;
  
  const mid = Math.floor(arr.length / 2);
  const izq = mergeSort(arr.slice(0, mid));
  const der = mergeSort(arr.slice(mid));
  
  return merge(izq, der);
}

function merge(izq, der) {
  const result = [];
  let i = 0, j = 0;
  
  while (i < izq.length && j < der.length) {
    if (izq[i] <= der[j]) result.push(izq[i++]);
    else result.push(der[j++]);
  }
  
  return [...result, ...izq.slice(i), ...der.slice(j)];
}

// Quick Sort - O(n log n) promedio, O(n²) peor caso
function quickSort(arr, bajo = 0, alto = arr.length - 1) {
  if (bajo >= alto) return;
  
  const pivoteIdx = particion(arr, bajo, alto);
  quickSort(arr, bajo, pivoteIdx - 1);
  quickSort(arr, pivoteIdx + 1, alto);
}

function particion(arr, bajo, alto) {
  const pivote = arr[alto];
  let i = bajo - 1;
  
  for (let j = bajo; j < alto; j++) {
    if (arr[j] <= pivote) {
      i++;
      [arr[i], arr[j]] = [arr[j], arr[i]];
    }
  }
  [arr[i+1], arr[alto]] = [arr[alto], arr[i+1]];
  return i + 1;
}

// Comparación de algoritmos de ordenamiento:
// Bubble Sort: O(n²) - solo para aprender
// Selection Sort: O(n²) - solo para aprender
// Insertion Sort: O(n²) pero O(n) para casi ordenados
// Merge Sort: O(n log n) siempre - estable
// Quick Sort: O(n log n) promedio - in-place
// Tim Sort: O(n log n) - el que usa Python y Java
Consejo✅ En producción, usa el sort() del lenguaje (Tim Sort en la mayoría). Implementa tu propio solo en entrevistas o casos muy específicos.
← Hash TablesBúsqueda Binaria →

Practica esta lección

Resuelve los ejercicios del curso de Algoritmos en la app, gratis y con corrección automática.

Empezar a practicar