排序 堆排序

2021-07-30 03:49:52 字數 1064 閱讀 6350

設有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 ...