#コンピュータ サイエンスにおけるヒープソート (1964 年に J. W. J. Williams によって発明) は、比較ベースの並べ替えアルゴリズムです。 Heapsort (ヒープソート) は、選択ソートを改良したものと考えることができます。このアルゴリズムと同様に、入力を ソート済み領域 と 未ソート領域 に分割し、最大の要素を抽出して移動します。ソートされていない領域をインタラクティブに縮小するには、ソート済み領域に移動します。改善点には、最大値を見つけるために線形時間検索の代わりにヒープ データ構造を使用することが含まれます。
実際には、ほとんどのマシンで適切に実装されたクイックソートよりも実行速度が少し遅くなりますが、実行時間が O(最悪の場合 log n) であるという利点があります。のほうが有利です。ヒープ ソートはインプレース ソート アルゴリズムですが、安定したソートではありません。
ヒープソート アルゴリズムは、ランダムに配置された値のセットを並べ替えます。アルゴリズムの最初のフェーズでは、ヒープのプロパティを満たすように配列要素が並べ替えられます。実際のソートに進む前に、説明のためにヒープ ツリー構造を簡単に示します。
PHP ヒープ ソート アルゴリズムのアイデアの概略図:
#PHP ヒープ ソート実装コードは次のとおりです:
<?php class Node { private $_i; public function __construct($key) { $this->_i = $key; } public function getKey() { return $this->_i; } } class Heap { private $heap_Array; private $_current_Size; public function __construct() { $heap_Array = array(); $this->_current_Size = 0; } public function remove() { $root = $this->heap_Array[0]; $this->heap_Array[0] = $this->heap_Array[--$this->_current_Size]; $this->bubbleDown(0); return $root; } public function bubbleDown($index) { $larger_Child = null; $top = $this->heap_Array[$index]; while ($index < (int)($this->_current_Size/2)) { $leftChild = 2 * $index + 1; $rightChild = $leftChild + 1; if ($rightChild < $this->_current_Size && $this->heap_Array[$leftChild] < $this->heap_Array[$rightChild]) { $larger_Child = $rightChild; } else { $larger_Child = $leftChild; } if ($top->getKey() >= $this->heap_Array[$larger_Child]->getKey()) { break; } $this->heap_Array[$index] = $this->heap_Array[$larger_Child]; $index = $larger_Child; } $this->heap_Array[$index] = $top; } public function insertAt($index, Node $newNode) { $this->heap_Array[$index] = $newNode; } public function incrementSize() { $this->_current_Size++; } public function getSize() { return $this->_current_Size; } public function asArray() { $arr = array(); for ($j = 0; $j < sizeof($this->heap_Array); $j++) { $arr[] = $this->heap_Array[$j]->getKey(); } return $arr; } } function heapsort(Heap $Heap) { $size = $Heap->getSize(); for ($j = (int)($size/2) - 1; $j >= 0; $j--) { $Heap->bubbleDown($j); } for ($j = $size-1; $j >= 0; $j--) { $BiggestNode = $Heap->remove(); $Heap->insertAt($j, $BiggestNode); } return $Heap->asArray(); } $arr = array(3, 0, 2, 5, -1, 4, 1); echo "原始数组 : "; echo implode(', ',$arr ); $Heap = new Heap(); foreach ($arr as $key => $val) { $Node = new Node($val); $Heap->insertAt($key, $Node); $Heap->incrementSize(); } $result = heapsort($Heap); echo "\n排序后数组 : "; echo implode(', ',$result)."\n";
原始数组 : 3, 0, 2, 5, -1, 4, 1 排序后数组 : -1, 0, 1, 2, 3, 4, 5
以上がPHP はヒープ ソート アルゴリズムを実装します (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。