首頁 >後端開發 >php教程 >學習PHP中堆排序演算法的原理及時間複雜度分析。

學習PHP中堆排序演算法的原理及時間複雜度分析。

王林
王林原創
2023-09-19 11:12:111232瀏覽

學習PHP中堆排序演算法的原理及時間複雜度分析。

學習PHP中堆排序演算法的原理及時間複雜度分析

#堆排序是一種基於堆資料結構的排序演算法,它的時間複雜度為O(nlogn)。本文將介紹PHP語言中堆排序演算法的原理,同時提供程式碼範例。

一、堆的定義和性質

在學習堆排序之前,首先需要了解堆的定義和性質。堆是一種完全二元樹,其每一個節點的值都大於或等於其子節點的值,我們把這樣的堆稱之為大頂堆。相反,如果每一個節點的值都小於或等於其子節點的值,我們稱之為小頂堆。

由於堆的特性,堆頂元素即為最大或最小值,因此在堆排序中,我們通常將待排序的數組看作一個完全二叉樹,並利用堆的特性進行排序。

二、堆排序演算法的原理

堆排序演算法主要分為建構堆和調整堆兩個步驟。

  1. 建構堆(buildHeap):將待排序的陣列調整為一個大頂堆。

步驟如下:

  • 從最後一個非葉子節點(即n/2-1)開始逐一向前遍歷,呼叫調整堆的函數(adjustHeap)。
  • 調整堆的函數採用自上而下的方式,對目前節點及其子樹進行調整,保證目前節點大於其子節點。
  • 重複以上兩個步驟,直到整個陣列調整為一個大頂堆。
  1. 調整堆(adjustHeap):將目前節點及其子樹調整為一個大頂堆。

步驟如下:

  • 根據目前節點的位置計算其左右子節點的位置。
  • 比較目前節點和其左右子節點的值,找到最大節點的位置。
  • 如果最大節點的位置不是目前節點的位置,則交換最大節點和目前節點的值,並遞歸呼叫自身對交換後的子樹進行調整。
  1. 排序(sortHeap):將堆頂元素(即陣列的第一個元素)與最後一個葉子節點交換,然後將剩餘的n-1個元素進行堆調整。

步驟如下:

  • 將堆頂元素與最後一個葉子節點交換。
  • 縮小堆的範圍,也就是忽略已經排序好的最後一個葉子節點。
  • 對縮小範圍的堆進行調整,保持大頂堆的性質。
  • 重複以上三個步驟,直到堆的範圍縮小為1。

三、PHP程式碼範例

下面是PHP語言實作堆排序演算法的範例程式碼:

function heapSort(&$arr) {
    $length = count($arr);

    // 构建大顶堆
    for ($i = floor($length/2 - 1); $i >= 0; $i--) {
        adjustHeap($arr, $i, $length);
    }

    // 调整堆并排序
    for ($i = $length - 1; $i >= 0; $i--) {
        // 交换堆顶元素和最后一个叶子节点
        $temp = $arr[0];
        $arr[0] = $arr[$i];
        $arr[$i] = $temp;

        // 调整堆使其保持大顶堆性质
        adjustHeap($arr, 0, $i);
    }
}

function adjustHeap(&$arr, $i, $length) {
    $largest = $i; // 最大值的位置
    $left = $i * 2 + 1; // 左子节点的位置
    $right = $i * 2 + 2; // 右子节点的位置

    // 比较当前节点与左右子节点的值,找到最大值的位置
    if ($left < $length && $arr[$left] > $arr[$largest]) {
        $largest = $left;
    }
    if ($right < $length && $arr[$right] > $arr[$largest]) {
        $largest = $right;
    }

    // 如果最大值的位置不是当前节点的位置,则交换两个位置的值,并递归调整堆
    if ($largest != $i) {
        $temp = $arr[$i];
        $arr[$i] = $arr[$largest];
        $arr[$largest] = $temp;
        adjustHeap($arr, $largest, $length);
    }
}

// 测试
$arr = [8, 3, 6, 2, 9, 1];
heapSort($arr);
print_r($arr); // 输出 [1, 2, 3, 6, 8, 9]

四、時間複雜度分析

堆排序的時間複雜度為O(nlogn)。其中,建構堆的時間複雜度為O(n),調整堆的時間複雜度為O(logn)。由於要對n個元素進行排序,因此總的時間複雜度為O(nlogn)。

總結

本文詳細介紹了PHP語言中堆排序演算法的原理,同時提供了對應的程式碼範例。堆排序是一種高效率的排序演算法,適用於待排序的陣列較大的情況。透過學習堆排序演算法,可以進一步提升對資料結構和演算法的理解和應用能力。

以上是學習PHP中堆排序演算法的原理及時間複雜度分析。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn