Skip to content
IRC-CodingIRC-Coding
AlgoritmosAlgoritmos estándarBúsqueda linealBúsqueda binariaBubblesortSelection SortInsertion SortAlgoritmos de ordenamientoAlgoritmos de búsquedaBig-OComplejidadEstructuras de datosPythonJava

Algoritmos estándar: búsqueda y ordenamiento

Aprende búsqueda lineal, binaria, Bubblesort, Selection Sort e Insertion Sort con análisis de complejidad y ejemplos de código.

S

schutzgeist

9 min read
Algoritmos estándar: búsqueda y ordenamiento

Algoritmos estándar: búsqueda lineal y binaria, ordenamiento, Bubblesort, Selection e Insertion

La búsqueda y el ordenamiento son operaciones fundamentales en el desarrollo de software. En este artículo conocerás cinco algoritmos esenciales: búsqueda lineal, búsqueda binaria, Bubblesort, Selection Sort e Insertion Sort. Para cada algoritmo explicaré cómo funciona, su complejidad temporal en notación Big-O y un ejemplo de código en Python.

Ya sea en una entrevista técnica, en tus estudios o en cualquier formación en programación, búsqueda y ordenamiento siempre aparecen. Normalmente se trata de implementaciones simples como Bubblesort o manejo básico de arrays.

Conviene que entiendas los algoritmos principales. Te harán la vida más fácil.

El tiempo es dinero, y aquí empieza el primer dilema de la programación: ¿cuándo es un algoritmo realmente bueno? ¿Cuándo es prácticamente inutilizable?

Con datasets pequeños casi no notas la diferencia entre esperar 0.2 segundos o 0.5. Pero con grandes volúmenes de datos, esos segundos se transforman en minutos. La elección correcta del algoritmo marca la diferencia.

Por eso medimos los algoritmos por velocidad. Nuestro objetivo siempre es encontrar el algoritmo más rápido. Ya hemos escrito sobre esto, pero como es relevante aquí, vale la pena mencionarlo de nuevo.

¿Qué significan O(1), O(n), O(log n) y O(n²)?

Antes de analizar cada algoritmo, debes entender cómo describimos su velocidad usando la notación Big-O. No te dice cuántos milisegundos tarda un algoritmo, sino cómo crece el tiempo de ejecución conforme aumentan los datos.

Aquí están las clases principales:

  • O(1) – constante: El tiempo no cambia sin importar cuántos datos haya. Acceder a un elemento del array por índice es un ejemplo.
  • O(log n) – logarítmica: El tiempo crece muy lentamente. La búsqueda binaria reduce el rango a la mitad en cada paso, por eso es O(log n).
  • O(n) – lineal: El tiempo crece proporcionalmente con los datos. Con 1.000 elementos tarda aproximadamente el doble que con 500.
  • O(n²) – cuadrática: El tiempo crece muy rápido. Con el doble de datos tarda aproximadamente cuatro veces más. Muchos algoritmos de ordenamiento simples tienen esta complejidad.

Big-O describe siempre el peor caso, el escenario más desfavorable. Te ayuda a estimar la peor ejecución posible de un algoritmo.

Encontrarás explicaciones más detalladas en Big-O Notation: Laufzeitkomplexität und Effizienz O(1), O(n), O(log n) y en la introducción a Komplexitätsanalyse, Big-O, Such- und Sortieralgorithmen. Para los siguientes algoritmos, basta con que mires nuestro análisis y puedas clasificarlos entre “BUENO” y “MENOS BUENO”.

Búsqueda lineal

La búsqueda lineal recorre una lista elemento por elemento hasta encontrar el buscado o llegar al final. Funciona tanto con datos ordenados como desordenados.

Empiezas al principio de la fila y avanzas hasta el final. Quizás tengas suerte y esté al inicio. Quizás sea el último elemento.

def lineare_suche(liste, ziel):
    for index, wert in enumerate(liste):
        if wert == ziel:
            return index
    return -1
  • Mejor caso: O(1) (el elemento está cerca del inicio)
  • Peor caso: O(n) (está al final)
  • Caso promedio: O(n)

La búsqueda lineal es simple pero lenta con grandes volúmenes.

Búsqueda binaria

La búsqueda binaria reduce el rango de búsqueda a la mitad en cada paso. Requiere que la lista esté ordenada. Comparada con búsqueda lineal, es mucho más rápida con grandes datasets.

def binaere_suche(liste, ziel):
    links = 0
    rechts = len(liste) - 1

    while links <= rechts:
        mitte = (links + rechts) // 2
        if liste[mitte] == ziel:
            return mitte
        if liste[mitte] < ziel:
            links = mitte + 1
        else:
            rechts = mitte - 1

    return -1
  • Mejor caso: O(1)
  • Peor caso: O(log n)
  • Caso promedio: O(log n)

Con un millón de elementos, búsqueda binaria necesita solo unos 20 comparaciones en el peor caso.

¿Cuántas sería con búsqueda lineal?

Bubblesort

Bubblesort compara repetidamente elementos adyacentes e intercambia aquellos que están en el orden incorrecto. Los elementos mayores suben gradualmente.

Este algoritmo es muy popular en exámenes y tareas simples. Vale la pena que lo entiendas a fondo.

def bubblesort(liste):
    n = len(liste)
    while True:
        vertauscht = False
        for i in range(n - 1):
            if liste[i] > liste[i + 1]:
                liste[i], liste[i + 1] = liste[i + 1], liste[i]
                vertauscht = True
        n -= 1
        if not vertauscht:
            break
    return liste
  • Mejor caso: O(n)
  • Peor caso: O(n²)
  • Caso promedio: O(n²)

Bubblesort es fácil de entender pero ineficiente con grandes volúmenes.

Selection Sort

Selection Sort busca el elemento más pequeño en cada pasada dentro del área desordenada e lo coloca al final del área ordenada.

def selection_sort(liste):
    n = len(liste)
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if liste[j] < liste[min_index]:
                min_index = j
        liste[i], liste[min_index] = liste[min_index], liste[i]
    return liste
  • Mejor caso: O(n²)
  • Peor caso: O(n²)
  • Caso promedio: O(n²)

Selection Sort es simple pero siempre cuadrático. Realiza menos intercambios que Bubblesort.

Insertion Sort

Insertion Sort inserta cada elemento en su posición correcta dentro del área ya ordenada. Es similar a cómo ordenas las cartas en tu mano mientras juegas.

def insertion_sort(liste):
    for i in range(1, len(liste)):
        aktuelles = liste[i]
        j = i - 1
        while j >= 0 and liste[j] > aktuelles:
            liste[j + 1] = liste[j]
            j -= 1
        liste[j + 1] = aktuelles
    return liste
  • Mejor caso: O(n)
  • Peor caso: O(n²)
  • Caso promedio: O(n²)

Insertion Sort es particularmente eficiente cuando la lista ya está casi ordenada.

Comparación de algoritmos de búsqueda y ordenamiento

AlgoritmoTipoMejor casoPeor casoCuándo usarlo
Búsqueda linealBúsquedaO(1)O(n)Datos pequeños y desordenados
Búsqueda binariaBúsquedaO(1)O(log n)Datos grandes y ordenados
BubblesortOrdenamientoO(n)O(n²)Solo para aprender
Selection SortOrdenamientoO(n²)O(n²)Datos pequeños, pocos intercambios
Insertion SortOrdenamientoO(n)O(n²)Datos casi ordenados, listas pequeñas

Qué algoritmo usar en cada caso

Para la búsqueda:

  • En datos sin ordenar, usa la búsqueda lineal.
  • En datos ordenados, usa la búsqueda binaria.

Para la ordenación:

  • Bubblesort solo sirve para aprender.
  • Selection Sort es simple pero lento.
  • Insertion Sort funciona bien con conjuntos pequeños o casi ordenados.
  • Para grandes volúmenes de datos, es mejor usar Quicksort, Mergesort o Heapsort.

La búsqueda lineal, búsqueda binaria, Bubblesort, Selection Sort e Insertion Sort son la base para entender algoritmos y estructuras de datos. Son simples, educativos y muestran claramente cómo Big-O describe el tiempo de ejecución. En la práctica, para grandes volúmenes de datos se usan algoritmos más rápidos, pero comprender estos cinco algoritmos estándar es esencial para cualquier desarrollador.

Recomendaciones de libros sobre algoritmos y estructuras de datos

Si quieres profundizar en algoritmos y estructuras de datos, te recomendamos los siguientes libros:

Keine Bücher für Kategorie "algorithmen" gefunden.

FAQ: Algoritmos estándar, búsqueda y ordenación

1. ¿Qué es un algoritmo estándar?

Un algoritmo estándar es un procedimiento comprobado para problemas recurrentes como búsqueda, ordenación o comparación. Estos algoritmos forman la base del pensamiento algorítmico en desarrollo de software.

2. ¿Cuál es la diferencia entre búsqueda y ordenación?

La búsqueda consiste en encontrar un elemento específico en un conjunto de datos. La ordenación significa reorganizar los elementos según un criterio determinado, por ejemplo en orden ascendente o alfabético.

3. ¿Qué es la búsqueda lineal?

La búsqueda lineal recorre una lista elemento por elemento hasta encontrar el que buscas o llegar al final. Funciona con datos ordenados y sin ordenar, con un tiempo de ejecución de O(n).

4. ¿Cuándo se usa la búsqueda lineal?

La búsqueda lineal tiene sentido cuando el conjunto de datos es pequeño o no está ordenado. En listas muy pequeñas, a menudo es más rápida que algoritmos complejos porque no requiere preparación.

5. ¿Qué es la búsqueda binaria?

La búsqueda binaria divide el rango de búsqueda por la mitad en cada paso. Requiere que los datos estén ordenados y tiene un tiempo de ejecución de O(log n).

6. ¿Por qué la búsqueda binaria es más rápida que la lineal?

La búsqueda binaria es más rápida porque reduce el rango de búsqueda a la mitad en cada paso. Con un millón de elementos, necesita alrededor de 20 comparaciones en el peor caso, mientras que la búsqueda lineal necesita hasta un millón.

7. ¿Qué requisito necesita la búsqueda binaria?

La búsqueda binaria necesita datos ordenados. Si la lista no está ordenada, primero debes ordenarla o usar una búsqueda lineal.

8. ¿Qué es Bubblesort?

Bubblesort es un algoritmo de ordenación simple que compara repetidamente elementos adyacentes e intercambia los que están en el orden incorrecto. Tiene un tiempo de ejecución en el peor caso de O(n²).

9. ¿Por qué Bubblesort casi nunca se usa en la práctica?

Bubblesort prácticamente no se usa en producción porque su tiempo de ejecución O(n²) es muy lento con grandes conjuntos de datos. Sin embargo, es un excelente ejemplo educativo para entender algoritmos de ordenación.

10. ¿Qué es Selection Sort?

Selection Sort busca el elemento más pequeño en cada pasada dentro de la parte sin ordenar y lo coloca en la siguiente posición de la parte ordenada. Su tiempo de ejecución es siempre O(n²).

11. ¿Qué es Insertion Sort?

Insertion Sort inserta cada elemento en la posición correcta dentro de la parte ya ordenada. Es particularmente eficiente cuando la lista ya está casi ordenada, con un tiempo de O(n) en el mejor caso.

12. ¿Cuál es el mejor caso de Insertion Sort?

El mejor caso de Insertion Sort es O(n). Ocurre cuando la lista ya está ordenada, porque cada elemento se inserta solo una vez sin necesidad de desplazamientos.

13. ¿Qué significa O(1)?

O(1) significa tiempo constante. El tiempo requerido es independiente del tamaño de la entrada. Un ejemplo es acceder a un elemento de un array mediante su índice.

14. ¿Qué significa O(n)?

O(n) significa tiempo lineal. El tiempo requerido crece proporcionalmente al tamaño de la entrada. Si duplicas la cantidad de datos, el algoritmo tardará aproximadamente el doble.

15. ¿Qué significa O(log n)?

O(log n) significa tiempo logarítmico. El tiempo crece muy lentamente porque el espacio del problema se reduce en cada paso. La búsqueda binaria es un ejemplo típico.

16. ¿Qué significa O(n²)?

O(n²) significa tiempo cuadrático. El tiempo de ejecución crece cuadráticamente con el tamaño de la entrada. Si duplicas los datos, el algoritmo necesita aproximadamente cuatro veces más tiempo. Bubblesort y Selection Sort tienen esta complejidad.

17. ¿Qué es el peor caso?

El peor caso describe el escenario más desfavorable para un algoritmo. La notación Big-O generalmente indica el peor caso, permitiéndote estimar el tiempo máximo de ejecución.

Claro que también tenemos un artículo sobre búsqueda binaria. Con estas FAQs ya conoces cómo funciona.

18. ¿Qué es el mejor caso?

El mejor caso describe el escenario más favorable. Por ejemplo, la búsqueda lineal encuentra un elemento inmediatamente al principio de la lista, dando un tiempo de O(1).

19. ¿Qué es un algoritmo de ordenación estable?

Un algoritmo de ordenación es estable cuando los elementos con valores iguales mantienen su orden original. Insertion Sort es estable, Bubblesort puede serlo, Selection Sort generalmente no es estable.

20. ¿Qué significa ordenación in-place?

Un algoritmo de ordenación funciona in-place cuando necesita solo una cantidad constante de memoria adicional y realiza la ordenación directamente en la lista original. Bubblesort, Selection Sort e Insertion Sort funcionan in-place.

21. ¿Cuál es el algoritmo de búsqueda más rápido?

Para datos ordenados, la búsqueda binaria con O(log n) es la más rápida de los algoritmos que aquí presentamos. Para datos sin ordenar, la búsqueda lineal con O(n) es la opción más simple.

22. ¿Cuál es el algoritmo de ordenación más rápido?

Entre los algoritmos que presentamos, Insertion Sort es el más rápido en el mejor caso con O(n). Sin embargo, para grandes conjuntos de datos aleatorios, Quicksort, Mergesort o Heapsort con O(n log n) son significativamente mejores.

23. ¿Cuándo debes usar Bubblesort?

Prácticamente nunca debes usar Bubblesort en código en producción. Está diseñado exclusivamente para aprender y entender algoritmos de ordenación.

24. ¿Se puede aplicar la búsqueda binaria a listas enlazadas?

La búsqueda binaria no es eficiente en listas enlazadas porque acceder al elemento central requiere O(n). Es óptima para arrays y estructuras similares con acceso directo por índice.

25. ¿Qué algoritmos de ordenación debe conocer todo desarrollador?

Todo desarrollador debe conocer Bubblesort, Selection Sort, Insertion Sort, Quicksort, Mergesort y Heapsort. Los algoritmos simples ayudan a entender Big-O y principios fundamentales, mientras que los complejos son esenciales en la práctica.
Volver al blog
Share:

Entradas relacionadas