Definition von Heap:
n Schlüsselwortsequenzen Kl, K2,...,Kn werden genau dann (Heap) genannt, wenn This Die Sequenz erfüllt die folgenden Eigenschaften (kurz: Heap-Eigenschaften): (1) ki<=k(2i) und ki<=k(2i+1)(1≤i≤n/2). Heap: Der große Root-Heap wird durch das >=-Zeichen ersetzt. k(i) entspricht dem Nicht-Blattknoten des Binärbaums, K(2i) ist der linke untergeordnete Knoten und k(2i+1) ist der rechte untergeordnete Knoten. Wenn der in dieser Sequenz gespeicherte Vektor R[1..n] als Speicherstruktur eines vollständigen Binärbaums betrachtet wird, ist der Heap im Wesentlichen ein vollständiger Binärbaum, der die folgenden Eigenschaften erfüllt: den Schlüssel eines beliebigen Nicht-Blattknotens in Der Baum ist ein Schlüsselwort, das nicht größer (oder nicht kleiner als) seine linken und rechten untergeordneten Knoten (falls vorhanden) ist.
/** * 调整堆 * @param array $arr 排序数组 * @param int $i 待调节元素的下标 * @param int $size 数组大小, 准确来说是数组最大索引值加1 */ function heapAjust(& $arr, $i, $size) { $key = $arr[$i]; // 索引从0开始 // 左孩子节点为 2i+1, 右孩子节点为 2i+2 for($j = 2 * $i + 1; $j < $size; $j = 2 * $j + 1) { if($j + 1 < $size && $arr[$j] < $arr[$j + 1]) $j++; if($key > $arr[$j]) break ; $arr[$i] = $arr[$j]; //调换值 $i = $j; } $arr[$i] = $key; } /** * 堆排序 * 时间复杂度:O(nlogn) * 不稳定的排序算法 */ function heapSort(& $arr) { $len = count($arr); // 构建初始大根堆 for($i = intval($len/2); $i >= 0; $i--) { heapAjust($arr, $i, $len); } // 调换堆顶元素和最后一个元素 for($j = $len - 1; $j > 0; $j--) { $swap = $arr[0]; $arr[0] = $arr[$j]; $arr[$j] = $swap; heapAjust($arr, 0, $j); //继续调整剩余元素为大根堆 } }
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Implementierung der Heap-Sortierung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!