溫馨提示×

php快速排序有哪些優化

PHP
小樊
97
2024-12-02 12:14:47
欄目: 編程語言

快速排序是一種高效的排序算法,通過遞歸地將數組分成兩個子數組來進行排序。為了提高PHP中快速排序的性能,可以采取以下優化措施:

  1. 隨機選擇基準值(Pivot):隨機選擇數組中的元素作為基準值,可以降低算法在最壞情況下的時間復雜度,從而提高性能。
function quickSort(&$arr, $left, $right) {
    if ($left < $right) {
        $pivotIndex = partition($arr, $left, $right);
        quickSort($arr, $left, $pivotIndex - 1);
        quickSort($arr, $pivotIndex + 1, $right);
    }
}

function partition(&$arr, $left, $right) {
    $pivotIndex = mt_rand($left, $right);
    $pivotValue = $arr[$pivotIndex];
    swap($arr, $pivotIndex, $right);
    $storeIndex = $left;
    for ($i = $left; $i < $right; $i++) {
        if ($arr[$i] < $pivotValue) {
            swap($arr, $storeIndex, $i);
            $storeIndex++;
        }
    }
    swap($arr, $right, $storeIndex);
    return $storeIndex;
}
  1. 三路快速排序:將數組分為三部分:小于基準值的元素、等于基準值的元素和大于基準值的元素。這樣可以減少不必要的比較和交換操作。
function quickSort三路($arr, $left, $right) {
    if ($left >= $right) {
        return;
    }
    $lt = $left;
    $i = $left + 1;
    $gt = $right;
    while ($i <= $gt) {
        if ($arr[$i] < $arr[$left]) {
            swap($arr, $lt++, $i++);
        } elseif ($arr[$i] > $arr[$left]) {
            swap($arr, $i, $gt--);
        } else {
            $i++;
        }
    }
    quickSort三路($arr, $left, $lt - 1);
    quickSort三路($arr, $gt + 1, $right);
}
  1. 插入排序優化:對于小數組,快速排序的性能可能不如插入排序??梢栽诳焖倥判虻倪^程中,當子數組的大小小于某個閾值時,切換到插入排序。
function quickSort插入排序($arr, $left, $right) {
    if ($right - $left <= 10) {
        insertionSort($arr, $left, $right);
        return;
    }
    $pivotIndex = partition($arr, $left, $right);
    quickSort插入排序($arr, $left, $pivotIndex - 1);
    quickSort插入排序($arr, $pivotIndex + 1, $right);
}
  1. 尾遞歸優化:通過將遞歸調用放在函數的末尾,可以減少函數調用棧的深度,從而降低內存消耗。
function quickSort尾遞歸($arr, $left, $right) {
    while ($left < $right) {
        $pivotIndex = partition($arr, $left, $right);
        if ($pivotIndex - $left < $right - $pivotIndex) {
            quickSort尾遞歸($arr, $left, $pivotIndex - 1);
            left = $pivotIndex + 1;
        } else {
            quickSort尾遞歸($arr, $pivotIndex + 1, $right);
            right = $pivotIndex - 1;
        }
    }
}

通過以上優化措施,可以在很大程度上提高PHP中快速排序的性能。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女