Heim  >  Artikel  >  Backend-Entwicklung  >  Komplexitätsanalyse verschiedener PHP-Array-Sortieralgorithmen

Komplexitätsanalyse verschiedener PHP-Array-Sortieralgorithmen

王林
王林Original
2024-04-27 09:03:02706Durchsuche

PHP-Array-Sortieralgorithmus-Komplexität: Blasensortierung: O(n^2) Schnelle Sortierung: O(n log n) (Durchschnitt) Zusammenführungssortierung: O(n log n)

各种 PHP 数组排序算法的复杂度分析

PHP-Array-Sortieralgorithmus-Komplexitätsanalyse

In PHP gibt es verschiedene Sortieralgorithmen, mit denen Elemente in einem Array sortiert werden können. Die Effizienz jedes Algorithmus variiert je nach Größe des Arrays und der Verteilung der Daten.

Bubble Sort

Bubble Sort ist ein einfacher Sortieralgorithmus, der jedoch weniger effizient ist. Dabei werden benachbarte Elemente wiederholt verglichen und das größere Element am Ende des Arrays ausgetauscht.

function bubbleSort($arr) {
    for ($i = 0; $i < count($arr); $i++) {
        for ($j = 0; $j < count($arr) - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    return $arr;
}

Zeitkomplexität: O(n^2)

Schnelle Sortierung

Schnelle Sortierung ist ein Divide-and-Conquer-Algorithmus und gilt allgemein als der effizienteste Sortieralgorithmus. Es verwendet Rekursion, um das Array in kleinere Unterarrays zu unterteilen und jedes Unterarray zu sortieren.

function quickSort($arr) {
    if (count($arr) <= 1) {
        return $arr;
    }
    $pivot = $arr[count($arr) - 1];
    $left = [];
    $right = [];
    for ($i = 0; $i < count($arr) - 1; $i++) {
        if ($arr[$i] < $pivot) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    return array_merge(quickSort($left), [$pivot], quickSort($right));
}

Zeitliche Komplexität: O(n log n) (im Durchschnitt)

Merge-Sortierung

Merge-Sortierung ist ebenfalls ein Divide-and-Conquer-Algorithmus. Es funktioniert, indem es das Array rekursiv in kleinere Unterarrays aufteilt, die Unterarrays sortiert und dann die sortierten Unterarrays zusammenführt.

function mergeSort($arr) {
    if (count($arr) <= 1) {
        return $arr;
    }
    $mid = count($arr) / 2;
    $left = mergeSort(array_slice($arr, 0, $mid));
    $right = mergeSort(array_slice($arr, $mid));
    return merge($left, $right);
}
function merge($left, $right) {
    $merged = [];
    $i = $j = 0;
    while ($i < count($left) && $j < count($right)) {
        if ($left[$i] <= $right[$j]) {
            $merged[] = $left[$i];
            $i++;
        } else {
            $merged[] = $right[$j];
            $j++;
        }
    }
    return array_merge($merged, array_slice($left, $i), array_slice($right, $j));
}

Zeitkomplexität: O(n log n)

Praktischer Fall

Angenommen, Sie haben ein Array mit 10000 ganzen Zahlen. Sie können dieses Array mit dem obigen Algorithmus sortieren und mit der PHP-Funktion microtime() messen, wie lange das Sortieren dauert.

$arr = range(1, 10000);
shuffle($arr); // 打乱数组以获得更现实的结果

$timeStart = microtime(true);
bubbleSort($arr);
$timeEnd = microtime(true);
echo "Bubble Sort: " . ($timeEnd - $timeStart) . " 秒\n";

$timeStart = microtime(true);
quickSort($arr);
$timeEnd = microtime(true);
echo "Quick Sort: " . ($timeEnd - $timeStart) . " 秒\n";

$timeStart = microtime(true);
mergeSort($arr);
$timeEnd = microtime(true);
echo "Merge Sort: " . ($timeEnd - $timeStart) . " 秒\n";

Für ein Array von 10.000 Ganzzahlen lauten die Ergebnisse wie folgt:

Bubble Sort: 1.0129920272827 秒
Quick Sort: 0.001443982124329 秒
Merge Sort: 0.001151084899902 秒

Die Ergebnisse zeigen, dass die schnelle Sortierung und die Zusammenführungssortierung deutlich effizienter sind als die Blasensortierung.

Das obige ist der detaillierte Inhalt vonKomplexitätsanalyse verschiedener PHP-Array-Sortieralgorithmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn