排序詳解 堆排序

2021-08-09 00:16:42 字數 1067 閱讀 6074

堆排序(heapsort)是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a[parent[i]] >= a[i]。在陣列的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。

演算法思想(以大頂堆為例):

1.將長度為n的待排序的陣列進行堆有序化構造成乙個大頂堆

2.將根節點與尾節點交換並輸出此時的尾節點

3.將剩餘的n -1個節點重新進行堆有序化

4.重複步驟2,步驟3直至構造成乙個有序序列

這裡的大根堆(最上面的節點最大),看可以看成乙個完全二叉樹,永遠將最大的元素維護在堆頂。

堆可以被看成是一棵樹,結點在堆中的高度可以被定義為從本結點到葉子結點的最長簡單下降路徑上邊的數目;定義堆的高度為樹根的高度。我們將看到,堆結構上的一些基本操作的執行時間至多是與樹的高度成正比,為o(lgn)。

//堆排序

//整理節點time:o(lgn)

templatevoid minheapify(t*arry, int

size, int element)

if (arry[lchild] <= arry[rchild])//如果左邊最小

else

//否則右面最小

lchild = element * 2 + 1;

rchild = lchild + 1;//重新計算子樹位置

}if (lchild < size&&arry[lchild] < arry[element])//只有左子樹且子樹小於自己

return;

}//堆排序time:o(nlgn)

templatevoid heapsort(t*arry, int

size)

while (size > 0)//拆除樹

return;

}

堆排序詳解

一 堆的定義 堆的定義如下 n個關鍵字序列l n 成為堆,當且僅當該序列滿足 l i l 2i 且l i l 2i 1 或者 l i l 2i 且l i l 2i 1 其中i屬於 1,n 2 滿足第 種情況的堆稱為小根堆 小頂堆 滿足第 種情況的堆稱為大根堆 大頂堆 在大根堆中,最大元素存放在根結點...

堆排序詳解

public class heapsort 此時已經完成了最大堆的構建,下面進行排序。for int i len 1 i 0 i 維護最大堆,保證父節點大於等於子節點 public static void maxheapify int a,int index,int len if rightchil...

堆排序詳解

基本概念 要了解堆排序,首先要了解什麼是堆,要了解堆,還要先了解什麼是完全二叉樹。一 什麼是完全二叉樹?完全二叉樹 complete binary tree 有嚴格的形狀要求 從根節點起每一層從左到右填充。一棵高度為d的完全二叉樹除了d 1層以外,每一層都是滿的。底層葉節點集中在左邊的若干位置上。完...