Comparación de Rendimiento entre Algoritmos de Ordenación en PHP

Este análisis evalúa el desempeño práctico de cuatro algoritmos clásicos de ordenación implementados nativamente en PHP: ordenación por burbuja, ordenación rápida, ordenación por selección y ordenación por inserción. Cada implementación ha sido rediseñada para mejorar claridad, evitar efectos secundarios y garantizar coherencia lógica, manteniendo la esencia algorítmica sin depender de funciones externas ni modificaciones in situ innecesarias.

Ordenación por Burbuja

Implementación iterativa que recorre repetidamente el arreglo, comparando pares adyacentes y reubicándolos si están desordenados. Cada pasada asegura que el elemento más grande no orednado "suba" a su posición final.

function sortBubble(array $values): array {
    $length = count($values);
    for ($pass = 0; $pass < $length - 1; $pass++) {
        $swapped = false;
        for ($idx = 0; $idx < $length - 1 - $pass; $idx++) {
            if ($values[$idx] > $values[$idx + 1]) {
                [$values[$idx], $values[$idx + 1]] = [$values[$idx + 1], $values[$idx]];
                $swapped = true;
            }
        }
        if (!$swapped) break;
    }
    return $values;
}

Ordenación Rápida (Quicksort)

Versión recursiva con partición basada en un pivote. Se selecciona un elemento central como referencia, se separan los valores menores y mayores, y se aplica recursivamente a ambas sublistas. Incluye optimización para arreglos pequeños mediante umbral de tamaño.

function sortQuick(array $items): array {
    $size = count($items);
    if ($size <= 1) return $items;
    
    $pivot = $items[(int)($size / 2)];
    $left = $right = $equal = [];
    
    foreach ($items as $value) {
        if ($value < $pivot) {
            $left[] = $value;
        } elseif ($value > $pivot) {
            $right[] = $value;
        } else {
            $equal[] = $value;
        }
    }
    
    return array_merge(sortQuick($left), $equal, sortQuick($right));
}

Ordenación por Selección

Algoritmo que identifica en cada iteración el valor mínimo restante dentro del segmento no ordenado y lo intercambia con el primer elemento de dicho segmento.

function sortSelection(array $data): array {
    $n = count($data);
    for ($i = 0; $i < $n - 1; $i++) {
        $minIndex = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($data[$j] < $data[$minIndex]) {
                $minIndex = $j;
            }
        }
        if ($minIndex !== $i) {
            [$data[$i], $data[$minIndex]] = [$data[$minIndex], $data[$i]];
        }
    }
    return $data;
}

Ordenación por Inserción

Método que construye la secuencia ordenada uno a uno: cada nuevo elemento se compara con los ya ordenados desde el final hacia adelante, desplazando elementos mayores hasta encontrar su posición correcta.

function sortInsertion(array $sequence): array {
    $len = count($sequence);
    for ($k = 1; $k < $len; $k++) {
        $current = $sequence[$k];
        $pos = $k - 1;
        while ($pos >= 0 && $sequence[$pos] > $current) {
            $sequence[$pos + 1] = $sequence[$pos];
            $pos--;
        }
        $sequence[$pos + 1] = $current;
    }
    return $sequence;
}

Medición de Tiempo de Ejecución

Para comparar objetivamente el rendimeinto, se genera un conjunto de prueba aleatorio de 1600 enteros únicos, se mezcla y se mide el tiempo transcurrido (en segundos) para cada algoritmo usando microtime(true).

function benchmark(callable $algorithm, array $input): float {
    $start = microtime(true);
    $algorithm($input);
    return microtime(true) - $start;
}

$sample = range(1, 2000);
$sample = array_intersect_key($sample, array_flip(array_rand($sample, 1600)));
shuffle($sample);

printf("Ordenación por burbuja: %.6f s\n", benchmark('sortBubble', $sample));
printf("Ordenación rápida:      %.6f s\n", benchmark('sortQuick', $sample));
printf("Ordenación por selección: %.6f s\n", benchmark('sortSelection', $sample));
printf("Ordenación por inserción: %.6f s\n", benchmark('sortInsertion', $sample));

Etiquetas: PHP quicksort bubblesort selection-sort insertion-sort

Publicado el 10-2 22:12