Ordenación de la burbuja en VBA/Excel

La ordenación más conocida (y la más infame) es la ordenación por el método de la burbuja, Su popularidad deriva de su nombre pegadizo y su simplicidad. Sin embargo, es una de las peores ordenaciones jamás concebida.

Esta ordenación hace comparaciones repetidas y si es necesario, intercambios de elementos adyacentes. Su nombre viene por la similitud del método con las burbujas en un tanque de agua, donde cada burbuja busca su propio nivel.

Option Explicit

Sub Burbuja()
Dim cont As Long
Dim a As Long, b As Long
Dim t As Long
Dim items As Variant
Dim oTimer As New clsTimer

items = Application.Transpose(Range("A1").CurrentRegion.Value)

oTimer.StartTimer
cont = UBound(items)
For a = 1 To cont
  For b = cont To a + 1 Step -1
    If items(b) < items(b - 1) Then
      t = items(b - 1)
      items(b - 1) = items(b)
      items(b) = t
    End If
  Next
Next
MsgBox oTimer.GetElapsedTime(Seconds)

Range("C1").Resize(10000, 1).Value = Application.Transpose(items)
End Sub

La ordenación de la burbuja se conduce mediante dos bucles. Ya que hay cont elementos en el array, el bucle externo causa que el array sea inspeccionado cont-1 veces. Esto asegura que, en el peor caso, cada elemento quede en su posición apropiada cuando termina la función. El bucle interno realiza las comparaciones y los intercambios reales.

Una ordenación de la burbuja es terrible para un número grande de elementos ya que el tiempo de ejecución está directamente relacionado con el número de comparaciones e intercambios.

Les comparto un enlace con el código de ejemplo el cual incluye la clase clsTimer para obtener el tiempo consumido en la ordenación.

También para que sea mas entendible el como funciona este algoritmo, les dejo el siguiente video, el cual es sumamente didáctico, divertido, todo un deleite audible y visual:



Comentarios

  1. Lo copio y lo pego así en Excel o tengo que moverle algo en donde dice Click?

    ResponderBorrar
  2. Si no puedes descargarte el archivo de ejemplo entonces no te va a funcionar por que hago uso de un modulo de clase para calcular el tiempo. En todo caso debes acceder al editor de VBA y poner sl siguiente código y debes de tener una serie de números en la columna A empezando desde la celda A1:

    Option Explicit

    Sub Burbuja()
    Dim cont As Long
    Dim a As Long, b As Long
    Dim t As Long
    Dim items As Variant

    items = Application.Transpose(Range("A1").CurrentRegion.Value)

    cont = UBound(items)
    For a = 1 To cont
    For b = cont To a + 1 Step -1
    If items(b) < items(b - 1) Then
    t = items(b - 1)
    items(b - 1) = items(b)
    items(b) = t
    End If
    Next
    Next

    Range("C1").Resize(10000, 1).Value = Application.Transpose(items)
    MsgBox "Ordenación realizada!"
    End Sub

    ResponderBorrar

Publicar un comentario