設有n個元素的序列 k1,k2,…,kn,當且僅當滿足下述關係之一時,稱之為堆。
解釋:如果讓滿足以上條件的元素序列 (k1,k2,…,kn)順次排成一棵完全二叉樹,則此樹的特點是:
樹中所有結點的值均小於(或大於)其左右孩子,此樹的根結點(即堆頂)必最小(或最大)。
從最後乙個非終端結點開始往前逐步調整,讓每個雙親大於(或小於)子女,直到根結點為止。
注:終端結點(即葉子)沒有任何子女,無需單獨調整。
基本思想:將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根節點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就會得到n個元素中的次最大值。如此反覆執行,便能得到乙個有序序列了。
<?php function heapsort(&$arr) else } //彈出第乙個陣列元素 array_shift($arr); } //整理當前樹節點($n),臨界點$last之後為已排序好的元素 function adjustnode($n,$last,&$arr) } //交換兩個值 /** * 使用異或交換2個值,原理:乙個值經過同乙個值的2次異或後,原值不變 * @param int $a * @param int $b */ function swap(&$a,&$b) $arr = [2,1,4,5,3]; heapsort($arr); var_dump($arr);
該演算法摘自:
補充:^
按位異或,不同為1,相同為0。
<<
向左移位,相當於乘以2的n次方
>>
向右移位,相當於除以2的n次方
堆排序 堆排序優化 索引堆排序
堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...
堆排序 堆排序優化 索引堆排序
堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...
堆排序 模擬堆排序
838.堆排序 輸入乙個長度為n的整數數列,從小到大輸出前m小的數。輸入格式 第一行包含整數n和m。第二行包含n個整數,表示整數數列。輸出格式 共一行,包含m個整數,表示整數數列中前m小的數。資料範圍 1 m n 1051 m n 105,1 數列中元素 1091 數列中元素 109 輸入樣例 5 ...