堆結構的概念:堆就是乙個陣列,它可以以完全二叉樹的形式表現出來。大根堆:完全二叉樹中每棵子樹的最大值都在頂部就是大根堆如何實現大根堆?堆操作之heapinsertheapinsert方法來實現將陣列「上浮」調整成大根堆。publicview codestatic
void heapinsert(int arr, int
index)
}
如何實現popmax操作?(找到最大值並返回,最後刪掉)堆操作之heapify方法:將乙個陣列調整成大根堆用於堆排序中,將第0個位置元素和最後乙個位置元素交換位置後,再將陣列調整成大根堆(「下沉」操作)。
* 方法結束後,把陣列變成了新的大根堆
* * 某個數處在index位置,看看能否往下沉
* 不斷的和左右兩個孩子進行比較
* 較大的孩子如果大於當前的父,較大孩子上來,父節點下沉。**
@param
arr:陣列
* @param
index:某個數處在index位置
* @param
heapsize:堆的有效長度(陣列的有效長度)
*/public
static
void heapify(int arr, int index, int
heapsize)
//如果較大孩子的值 大於 父節點值 交換值
swap(arr, largest, index);
index = largest; //
把largest的下標給index
left = index * 2 + 1; //
繼續比較
} }
view code
通過heapinsert和heapify就可以很容易實現堆排序堆排序操作:將第0個元素和最後乙個元素交換,然後將堆的有效長度減1後可以得到之前0位置的元素(最大或最小的),再執行heapify操作 (下沉),重新調整堆結構。
publicstatic
void heapsort(int
arr)
//如果使用者是乙個乙個的輸入元素,就要使用heapinsert()方法來新增元素
for (int i = 0; i < arr.length; i++)
//如果使用者一次性給了全部元素,只是用heapify方法,將全部元素(陣列)構造成乙個大根堆即可
//從最後乙個節點開始加入
//for (int i = arr.length - 1; i >= 0; i--)
//如何排序 ? : 將0號位置元素與最後位置元素交換,將有效長度減1 得到最後位置的元素。再變成大根堆,重複此過程
int heapsize =arr.length;
swap(arr, 0, --heapsize);
while (heapsize > 0)
}
新增對數器後的測試結果:堆排序(大根堆 小根堆)
堆 堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key i key 2i 1 ke...
堆排序(大根堆)
堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。1.堆堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。...
堆排序 大根堆
include include using namespace std define max 100010 int heap max heap i 的孩子是 2 i 1 2 i 2 父親是 i 1 2 int heapsize 0 初始化堆的大小 void heapinsert int index ...