選擇排序之堆排序

2021-10-06 07:50:21 字數 2730 閱讀 4967

(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.每個節點的 左右子樹都是乙個二叉堆。當父節點的值大於或者等於任意乙個子結點的值時,則成為大根堆 ...