排序演算法(一) java實現堆排序

2021-09-24 08:02:08 字數 1215 閱讀 9079

堆排序的基本思想

堆排序就是利用堆(假設進行公升序,也就是使用大頂堆)進行排序的方法。它的基本思想是,將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將其與堆陣列的末尾元素交換,此時末尾元素就是最大值,然後將剩餘的 n - 1 個序列重新構造成乙個堆,這樣就得到 n - 1個元素中的次大值。如此反覆執行, 便能得到乙個有序序列了 。

這裡構造大頂堆的時候是從最後乙個節點的父節點開始的,也就是arr.length/2-1,從下至上,從右至左依次調整,調整完後堆頂為最大值,再與最後乙個元素交換,交換完後再調整。

調整時是從該節點的左右孩子進行比較,孩子節點為k=2*i+1,左孩子大就取左右孩子大則k+1,根節點大則break;這裡交換用了個位運算可以簡單裝一下,**如下:

public

class

heapsort

; heapsort heap=

newheapsort()

; heap.

heapsort

(arr)

; system.out.

println

(arrays.

tostring

(arr));

}private

void

heapsort

(int

arr)

//將堆頂元素與最後乙個元素交換,再繼續調整堆

for(

int j=arr.length-

1;j>

0;j--)}

private

void

swap

(int

arr,

int i,

int j)

private

void

adjustheap

(int

arr,

int i,

int length)

if(temp>=arr[k]

)else

} arr[i]

=temp;

}}

時間複雜度:

堆排序演算法(java實現)

public class heapsort 左孩子編號 public static int leftchild int i 右孩子編號 public static int rightchild int i 保持最大堆的性質 param a,堆中的陣列元素 param i,對以該元素為根元素的堆進行調...

Java實現堆排序演算法

這是第乙個 之前只知道如何建堆,不知道演算法導論上還有如此巧妙的堆調整演算法。所以一開始自己寫的堆排序演算法非常低效,事件複雜度為o n 2 因為每次排序都是重建堆。但是,自己寫的程式還是有自己獨特的思想的,依然要分享出來給大家看看,尤其是確定陣列表示的樹的首個葉子節點的位置的方法。以下為 pack...

java實現堆排序演算法

堆排序相對簡單的冒泡演算法快就快在它利用了每一次排序,將結果儲存下來。堆結構是一顆完全二叉樹,即除了最後一層其他層的每個結點都包含兩個子結點,我們知道擁有子節點的元素腳標是0至n 2 1,我們從n 2 1開始向上構建大頂堆結構,每乙個父親結點的值都大於孩子結點,先取得左結點l和右結點r,比較結點大小...