PHP內功之排序__2.堆排序
阿新 • • 發佈:2018-11-15
堆(二叉堆),指得不是堆疊的那個堆,而是一種資料結構。
資料結構: 資料結構是計算機儲存、組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率.
資料: 單個元素,也可以是資料流,
資料流,: 多種資料融合在一起
傳入多個引數,輸出多個引數和結果,這個過程就叫演算法和函式,演算法=函式.
資料結構+演算法=程式1.程式碼
/** * Created by PhpStorm. * User: magang-ssd-02 * Date: 2018/10/9 * Time: 15:37 * 堆排序 (大根堆) * 思路: 堆排序利用了大根堆堆頂記錄的關鍵字最大(或最小)這一特徵 * 白話: 堆排序(HeapSort)是指利用堆積樹(堆)這種資料結構所涉及的一種排序演算法,它是排序的一種. * 可以利用陣列的特點快速定位指定索引的元素.堆分為大根堆和小根堆,是完全二叉樹. * 大根堆的要求是每個節點的值都不大於其父節點的值,即A[PARENT[i]] >= A[i] * 在陣列的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂. */ class HeapSort { // 受保護的兩個變數 $count $data protected $count; protected $data; function __construct(array $data) { $this->count = count($data); $this->data = $data; } public function run() { $this->createHeap(); while ($this->count > 0) { /* 這是一個大頂堆,所有堆頂的節點必須是最大的 根據此特點,每次都將堆頂資料移動到最後一位 然後對剩餘資料節點再次建造堆就可以 */ $this->swap($this->data[0], $this->data[--$this->count]); $this->buildHeap($this->data, 0, $this->count); } return $this->data; } /** * 建立一個堆 */ public function createHeap() { $i = floor($this->count / 2) + 1; while ($i--) { $this->buildHeap($this->data, $i, $this->count); } } /** * 從 陣列 的 第 $i 個節點開始至 陣列長度為0 結束,遞迴的將其 (包括其子節點) 轉化為一個小頂堆 * @param array $data * @param $i * @param $count */ public function buildHeap(array &$data, $i, $count) { if (false === $i < $count) { return; } //獲取左 / 右節點 $right = ($left = 2 * $i + 1) + 1; $max = $i; //如果左子節點大於當前節點,那麼記錄左節點鍵名 if ($left < $count && $data[$i] < $data[$left]) { $max = $left; } //如果右節點大於剛剛記錄的 $max , 那麼再次交換 if ($right < $count && $data[$max] < $data[$right]) { $max = $right; } if ($max !== $i && $max < $count) { $this->swap($data[$i], $data[$max]); $this->buildHeap($data, $max, $count); } } /** * 交換空間 * @param $left * @param $right */ public function swap(&$left, &$right) { list($left,$right) = array($right,$left); } } echo "<pre>"; $tempArr = []; for ($i = 0; $i < 1000; $i ++) { $tempArr[$i] = mt_rand(1,9999999); } //$array = array (4, 21, 41, 2, 53, 1, 213, 31, 21, 423, 56); $result = (new HeapSort($tempArr))->run(); var_dump($result);