Algoritmos que todo desarrollador de JavaScript debe conocer

Algoritmos que todo desarrollador de JavaScript debe conocer

Los algoritmos son fundamentales en el desarrollo de software. Como desarrollador/a de JavaScript, comprender y aplicar algoritmos eficientes y estructuras de datos adecuadas puede marcar la diferencia en el rendimiento y la escalabilidad de tus aplicaciones.

En este artículo, explicaremos algunos de los algoritmos más utilizados que todo desarrollador de JavaScript debería conocer.


¿Qué son los algoritmos?

Los algoritmos son conjuntos de instrucciones o pasos lógicos que resuelven un problema o realizan una tarea específica. En el contexto de la programación, los algoritmos son la base fundamental para resolver problemas de manera eficiente y automatizada.

Importancia de utilizar algoritmos eficientes

La utilización de algoritmos eficientes es crucial para los desarrolladores de JavaScript. Un algoritmo eficiente permite realizar tareas en menos tiempo y con menos recursos, lo que se traduce en una mejor experiencia para los usuarios finales.

Al dominar los algoritmos los desarrolladores pueden optimizar el rendimiento de sus aplicaciones, mejorar la escalabilidad y reducir los tiempos de respuesta. Esto se traduce en aplicaciones más rápidas, eficientes y capaces de manejar de manera efectiva los retos y demandas del mundo real.

Algoritmos de búsqueda

Los algoritmos de búsqueda son fundamentales en el desarrollo de aplicaciones para encontrar elementos específicos en un conjunto de datos. En JavaScript, existen varios algoritmos de búsqueda comunes, dos de los cuales son el Algoritmo de Búsqueda Lineal y el Algoritmo de Búsqueda Binaria.

Algoritmo de Búsqueda Lineal

El Algoritmo de Búsqueda Lineal es el método más simple y directo para buscar un elemento en una lista o arreglo. Comienza desde el primer elemento y recorre secuencialmente cada uno hasta encontrar la coincidencia deseada. En el peor de los casos, si el elemento se encuentra al final de la lista, se recorrerán todos los elementos.

function busquedaLineal(arr, elemento) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === elemento) {
      return i; // Retorna el índice del elemento encontrado
    }
  }
  return -1; // Retorna -1 si el elemento no se encuentra en el arreglo
}

const arreglo = [10, 5, 3, 8, 2, 6];
const elementoBuscado = 8;
const indice = busquedaLineal(arreglo, elementoBuscado);
console.log(`El elemento ${elementoBuscado} se encuentra en el índice ${indice}.`);


// Output:

// El elemento 8 se encuentra en el índice 3.



Algoritmo de búsqueda binaria

El Algoritmo de Búsqueda Binaria es una técnica más eficiente para buscar elementos en una lista ordenada. Funciona dividiendo repetidamente a la mitad el rango de búsqueda hasta encontrar la coincidencia.

Este enfoque aprovecha la propiedad de que los datos están ordenados, lo que permite descartar la mitad de los elementos en cada paso.

function busquedaBinaria(arr, elemento) {
  let inicio = 0;
  let fin = arr.length - 1;

  while (inicio <= fin) {
    let medio = Math.floor((inicio + fin) / 2);
    if (arr[medio] === elemento) {
      return medio; // Retorna el índice del elemento encontrado
    } else if (arr[medio] < elemento) {
      inicio = medio + 1;
    } else {
      fin = medio - 1;
    }
  }
  return -1; // Retorna -1 si el elemento no se encuentra en el arreglo
}

const arregloOrdenado = [2, 3, 5, 6, 8, 10];
const elementoBuscado = 6;
const indice = busquedaBinaria(arregloOrdenado, elementoBuscado);
console.log(`El elemento ${elementoBuscado} se encuentra en el índice ${indice}.`);


Sabiendo esto, podemos decir que el Algoritmo de Búsqueda Lineal es útil cuando trabajamos con un conjunto de datos pequeño o que no están ordenados y no se dispone de ninguna información adicional sobre la ubicación del elemento.

Sin embargo, en casos en los que los datos están ordenados, el Algoritmo de Búsqueda Binaria puede ser mucho más eficiente, ya que reduce el rango de búsqueda a la mitad en cada iteración.

Algoritmos de Ordenamiento

Los Algoritmos de Ordenamiento son técnicas utilizadas para organizar los elementos de una lista o arreglo en un orden específico. En JavaScript, existen varios algoritmos de ordenamiento populares y de gran utilidad para los desarrolladores. A continuación, se presentan algunos de ellos:

Algoritmo de Ordenamiento Burbuja

El algoritmo de burbuja es un método que funciona para ordenar algoritmos tanto de forma creciente como decreciente. Con este algoritmo, iteramos e intercambiamos pares hasta lograr mover el elemento más grande (o el más pequeño, dependiendo lo que se quiera lograr) al final de la lista. Una vez logrado esto, se procede a mover el segundo elemento más grande (o segundo más pequeño) al penúltimo puesto de la lista y así iremos “burbujeando” hasta lograr el arreglo ordenado que buscamos.

A continuación, una ilustración que demuestra cómo funciona el algoritmo en su primera iteración, siendo [5, 3, 8, 2, 6] el arreglo original. En este caso nuestro objetivo sería ordenar el algoritmo de forma ascendente.


Como se mencionó anteriormente, nuestro objetivo en la primera iteración es mover el elemento más grande al final. En este caso, nuestro elemento más grande es 8. En la siguiente iteración donde i=1 nuestra meta sería mover 6 (el segundo número mayor) al penúltimo puesto, el cual en este caso ya se encuentra ahí.

Ya tenemos una idea de cómo funciona el algoritmo, pero ¿cómo se vería en código JavaScript?

function ordenamientoBurbuja(arr) {
  const n = arr.length;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {

        // Intercambio de elementos

        const temp = arr[j]
        arr[j] = arr[j + 1]

        arr[j + 1] = temp
      }
    }
  }
  return arr;
}

const arreglo = [5, 3, 8, 2, 6];
const arregloOrdenado = ordenamientoBurbuja(arreglo);
console.log(arregloOrdenado); // Output: [2, 3, 5, 6, 8]



Es importante tener en cuenta que el algoritmo de ordenamiento burbuja no es eficiente para grandes conjuntos de datos, ya que su complejidad es cuadrática (O(n^2)). Sin embargo, es un algoritmo útil para aprender y comprender los conceptos básicos de los algoritmos de ordenamiento.

Recuerda que existen otros algoritmos más eficientes, como el Algoritmo de Ordenamiento Rápido (Quicksort), que se utiliza en situaciones donde se requiere un mayor rendimiento en la ordenación de grandes conjuntos de datos.

Algoritmo de ordenamiento rápido (Quicksort)

Utiliza el enfoque de "divide y vencerás" para ordenar la lista. Este algoritmo divide la lista en subconjuntos más pequeños y ordena cada subconjunto de manera recursiva. Es uno de los más eficientes y ampliamente utilizados para el ordenamiento. Aquí tienes un ejemplo de implementación:

function ordenamientoRapido(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  const pivot = arr[arr.length - 1]; 

  // En muchos casos también se utiliza pivot = arr[0]


  let menores = [];
  let mayores = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < pivot) {
      menores.push(arr[i]);
    } else {
      mayores.push(arr[i]);
    }
  }

  return [...ordenamientoRapido(menores), pivot, ...ordenamientoRapido(mayores)];
}

const arreglo = [5, 3, 8, 2, 6];
const arregloOrdenado = ordenamientoRapido(arreglo);
console.log(arregloOrdenado); // Output: [2, 3, 5, 6, 8]



Algoritmo de Ordenamiento Notation (Notation Sort)

También conocido como Notation Sort, es un algoritmo de ordenamiento poco convencional. A diferencia de otros algoritmos que se basan en comparaciones directas entre elementos, el Notation Sort utiliza una notación especial para determinar el orden de los elementos en la lista. Aunque no es un algoritmo práctico en términos de eficiencia y rendimiento, es interesante explorar su funcionamiento y sus posibles usos en situaciones particulares.

El Algoritmo de Ordenamiento Notation se basa en la asignación de un valor numérico o una etiqueta a cada elemento de la lista a ordenar. Estos valores numéricos o etiquetas son generados de alguna manera específica, no necesariamente relacionada con el valor real de los elementos. Luego, se realiza un proceso de clasificación utilizando estos valores asignados, lo que resulta en una nueva ordenación de los elementos.

La idea detrás del algoritmo de ordenamiento Notation es que la asignación de valores o etiquetas no depende de las comparaciones directas entre los elementos, sino de una serie de reglas o criterios establecidos previamente. Estos criterios pueden ser arbitrarios o basados en algún aspecto particular de los elementos. Por ejemplo, se pueden asignar valores según el número de vocales en una cadena de texto o según la longitud de las palabras.

Veamos un ejemplo de implementación del Algoritmo de Ordenamiento Notation en JavaScript utilizando una asignación de valores basada en la longitud de las palabras:

function notationSort(arr) {
  const sortedIndices = arr
    .map((value, index) => index)
    .sort((a, b) => {
      const lengthA = arr[a].length;
      const lengthB = arr[b].length;
      return lengthA - lengthB;
    });

  const result = [];
  for (const index of sortedIndices) {
    result.push(arr[index]);
  }
 
  return result;
}

// Ejemplo de uso
const palabras = ["manzana", "perro", "gato", "banana"];
const palabrasOrdenadas = notationSort(palabras);
console.log(palabrasOrdenadas); // Output: ["gato", "perro", "banana", "manzana"]

En este ejemplo, tenemos un array de palabras desordenadas ["manzana", "perro", "gato", "banana"]. Aplicando el Algoritmo de Ordenamiento Notación basado en la longitud de las palabras, obtendremos el array ordenado ["gato", "perro", "banana", "manzana"].

Comparación de rendimiento y eficiencia de los algoritmos de ordenamiento

Cada algoritmo de ordenamiento tiene sus ventajas y desventajas en términos de rendimiento y eficiencia. El algoritmo de Ordenamiento Burbuja, aunque fácil de implementar, tiende a ser lento en grandes conjuntos de datos debido a su complejidad cuadrática. Asimismo, el Algoritmo de Ordenamiento rápido (Quicksort) es más eficiente y suele ser preferido para conjuntos de datos grandes. Por otro lado, el Algoritmo de Notation es bueno para clasificaciones más personalizadas, no necesariamente numéricas.

En el día a día, los desarrolladores de JavaScript pueden utilizar estos algoritmos para optimizar su código en diferentes situaciones. Por ejemplo, al tener un conjunto de datos grande que necesita ser ordenado, el uso de algoritmos más eficientes, como el Ordenamiento Rápido, puede agilizar el procesamiento. En otros casos, como cuando se necesita ordenar un conjunto de datos pequeño o mantener una lista parcialmente ordenada, existen otros algoritmos como los de ordenamiento por inserción o selección los cuales pueden ser una mejor opción. La elección del algoritmo adecuado dependerá de las necesidades específicas del proyecto y la optimización requerida.


Conclusión

El conocimiento y la aplicación de algoritmos es esencial para cualquier desarrollador de JavaScript que busque escribir código eficiente y escalable. En este artículo, hemos explorado algunos de los algoritmos más utilizados, los algoritmos de búsqueda y ordenamiento. Además, hemos destacado su aplicación en situaciones reales y cómo pueden mejorar el rendimiento de tus aplicaciones. Continúa practicando y explorando estos conceptos, ya que dominarlos te convertirá en un desarrollador más competente y te permitirá resolver problemas de manera más efectiva.

Recuerda que este artículo solo raspa la superficie de los algoritmos y estructuras de datos. Te animo a seguir aprendiendo, investigando y aplicando estos conceptos en tus proyectos. ¡Explora las posibilidades y desafíate a ti mismo/a para convertirte en experto/a en algoritmos y estructuras de datos con JavaScript!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.