(1)堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。
(2)堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子節點的值,稱為大頂堆,注意:沒有要求節點的左孩子的值和右孩子的值的大小關係。
(3)每個節點的值都小於或等於其左右孩子節點的值,稱為小頂堆。
(4)大頂堆舉例說明:
(5)小頂堆舉例說明
(1)將待排序序列構造成乙個大頂堆。
(2)此時,整個序列的最大值就是堆頂的根節點。
(3)將其與末尾元素進行交換,此時末尾就為最大值。
(4)然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了。
簡單總結下堆排序的基本思路:
(1)將無序序列構成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆。
(2)將堆頂元素與末尾元素交換,將最大元素與陣列末尾元素交換。
(3)重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換,知道整個序列有序。
@test
public
void
testsort()
long start =
system
.currenttimemillis()
;//bubblesorting(array);//氣泡排序排序100000個數總耗時17984毫秒
//selectsorting(array);//選擇排序排序100000個數總耗時3203毫秒
//insertsorting(array);//直接插入排序100000個數總耗時1109毫秒
//shellsortbyexchange(array);//希爾的交換排序100000個數總耗時7829毫秒
//shellsortbymove(array);//希爾的移動排序100000個數總耗時16毫秒
//quicksort(array,0,array.length-1);//快速排序的移動排序100000個數總耗時31毫秒
//mergesort(array,0,array.length-1,new int[array.length]);//歸併排序的移動排序100000個數總耗時16毫秒
//cardinalitysort(array);//基數排序的移動排序100000個數總耗時31毫秒
heapsort
(array)
;//堆排序的移動排序100000個數總耗時14496毫秒
long end =
system
.currenttimemillis()
;system
.out.
println
("總共耗時:"
+(end-start));
}//堆排序
public
void
heapsort
(int
array)
//將堆頂元素與陣列的末尾元素進行交換
for(
int i = array.length-
1; i >
0; i--)}
}/**
* 將以index為非葉子節點的樹調整為最大堆
* 例如,array =
* 4
* 6 8
* 5 9
* 傳入index=1時,經過adjustheap方法調整後,array=
* 4
* 9 8
* 5 6
* 在傳入index=0時,經過adjustheap方法調整後,array=
* 9
* 6 8
* 5 4
* @param array 待調整的陣列
* @param index 非葉子節點在陣列中的索引
* @param length 待調整陣列元素的個數
*/public
void
adjustheap
(int
array,
int index,
int length)
//比較非葉子節點和子節點的大小
if(array[i]
> temp)
break;}
//當for迴圈之後,就已經將以index為根節點的樹中的最大值放到了最頂處
//把temp放到調整後的合適位置
array[index]
= temp;
}
選擇排序之堆排序
include includevoid swap int data,int i,int j 優美的遞迴實現堆調整 void adjustbigtopheap int data,int root,int n max root,意味著左孩子或右孩子大於父節點的值 即根為root的二叉樹的大頂堆性質被破壞...
選擇排序之堆排序
堆的定義,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的堆稱為大根堆,大根堆的最大元素存放在根結點,且...
選擇排序之堆排序
堆排序 heapsort 是利用堆積樹這種資料結構所設計的一種排序演算法,他是選擇排序的一種,其儲存結構類似於完全二叉樹 二叉堆滿足的性質 1父節點的值總是大於或者等於 小於或者等於 孩子節點的值的 2.每個節點的 左右子樹都是乙個二叉堆。當父節點的值大於或者等於任意乙個子結點的值時,則成為大根堆 ...