Ketahui prinsip dan analisis kerumitan masa algoritma isihan timbunan dalam PHP
Isihan timbunan ialah algoritma isihan berdasarkan struktur data timbunan, dan kerumitan masanya ialah O(nlogn). Artikel ini akan memperkenalkan prinsip algoritma isihan timbunan dalam bahasa PHP dan memberikan contoh kod.
1. Definisi dan sifat timbunan
Sebelum mempelajari pengisihan timbunan, anda perlu memahami definisi dan sifat timbunan. Timbunan ialah pokok perduaan lengkap di mana nilai setiap nod adalah lebih besar daripada atau sama dengan nilai nod anaknya Kami memanggil timbunan tersebut sebagai timbunan maksimum besar. Sebaliknya, jika nilai setiap nod adalah kurang daripada atau sama dengan nilai nod anaknya, kami memanggilnya timbunan atas kecil.
Disebabkan oleh ciri-ciri timbunan, elemen atas timbunan adalah nilai maksimum atau minimum Oleh itu, dalam pengisihan timbunan, kita biasanya menganggap tatasusunan itu sebagai pokok binari yang lengkap dan menggunakan ciri-ciri timbunan untuk. menyusun.
2. Prinsip algoritma isihan timbunan
Algoritma isihan timbunan terbahagi terutamanya kepada dua langkah: membina timbunan dan melaraskan timbunan.
Langkahnya adalah seperti berikut:
Langkah-langkahnya adalah seperti berikut:
Langkah-langkahnya adalah seperti berikut:
3. Contoh kod PHP
Berikut ialah contoh kod untuk melaksanakan algoritma pengisihan timbunan dalam bahasa 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]
4 Analisis kerumitan masa
Kerumitan masa pengisihan timbunan ialah O(nlogn). Antaranya, kerumitan masa membina timbunan ialah O(n), dan kerumitan masa melaraskan timbunan ialah O(logn). Oleh kerana n elemen perlu diisih, jumlah kerumitan masa ialah O(nlogn).
Ringkasan
Artikel ini memperkenalkan prinsip algoritma isihan timbunan dalam bahasa PHP secara terperinci dan menyediakan contoh kod yang sepadan. Isihan timbunan ialah algoritma pengisihan yang cekap sesuai untuk tatasusunan besar untuk diisih. Dengan mempelajari algoritma isihan timbunan, anda boleh meningkatkan lagi pemahaman anda dan keupayaan aplikasi struktur data dan algoritma.
Atas ialah kandungan terperinci Ketahui prinsip dan analisis kerumitan masa bagi algoritma isihan timbunan dalam PHP.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!