packagesort.algorithm;
public
class
heapsort
// 右孩子編號
public
static
int
rightchild(
int
i)
/**
* 保持最大堆的性質
* 堆中的陣列元素
* 對以該元素為根元素的堆進行調整,假設前提:左右子樹都是最大堆
* 由於左右孩子都是最大堆,首先比較根元素與左右孩子,找出最大值,假如大於根元素,則調整兩個元素的值;
* 由於左孩子(右孩子)的值與根元素交換,有可能打破左子樹(右子樹)的最大堆性質,因此繼續呼叫,直至葉子元素。
*/
public
static
void
max_heapify(
int
a,
int
i)
else
if
(right < heap_size && a[right] > a[largest])
if
(largest == i)
else
}
/**
* 建立最大堆。在資料中,下標a.length/2+1一直到最後的元素a.length-1都是葉子元素
* 因此從其前乙個元素開始,一直到
* 第乙個元素,重複呼叫max_heapify函式,使其保持最大堆的性質
*/
public
static
void
build_max_heap(
int
a)
}
/**
* 堆排序:首先建立最大堆,然後將堆頂元素(最大值)與最後乙個值交換,同時使得 堆的長度減小1
* 呼叫保持最大堆性質的演算法調整,使得堆頂元素成為最大值,此時最後乙個元素已被排除在外、
*/
public
static
void
heapsort(
int
a)
}
public
static
void
main(string args) ;
heap_size = a.length;
//最大數
heapsort(a);
//輸出結果
for
(
int
i =
0
; i < a.length; i++)
}
}
選擇排序之堆排序
include includevoid swap int data,int i,int j 優美的遞迴實現堆調整 void adjustbigtopheap int data,int root,int n max root,意味著左孩子或右孩子大於父節點的值 即根為root的二叉樹的大頂堆性質被破壞...
選擇排序之堆排序
1 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。2 堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子節點的值,稱為大頂堆,注意 沒有要求節點的左孩子的值和右孩子的值的大小關係。3 每個節點...
選擇排序之堆排序
堆的定義,n個關鍵字序列l 1.n 稱為堆,當且僅當序列滿足 1.l i l 2i 且 l i l 2i 1 大根堆 2.l i l 2i 且l i l 2i 1 小根堆 i需要滿足的特點為 1 i n 2 可以將一維陣列視為一棵完全二叉樹,滿足條件1的堆稱為大根堆,大根堆的最大元素存放在根結點,且...