Java實現堆排序

2021-07-24 14:05:08 字數 1952 閱讀 4824

堆排序是一種樹形選擇排序方法,它的特點是:在排序的過程中,將array[0…n-1]看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子節點之前的內在關係,在當前無序區中選擇最大(最小元素)。

1.若array[0,…,n-1]表示一顆完全二叉樹的順序儲存模式,則雙親節點指標跟孩子節點指標之間的內在關係如下:

任一節點指標i:父節點:i == 0 ? null : (i-1)/2

左孩子:2 * i + 1

右孩子:2 * i + 2

2.堆的定義:n個關鍵字序列array[0, .., n-1],當且僅當滿足下列要求:(0=< i <= (n-1) /2)

3.建立大根堆:

n個節點的完全二叉樹array[0,…,n-1],最後乙個節點n-1是第(n-1-1)/2個節點的孩子。對第(n-1-1)/2個節點為根的子樹調整,使該子樹稱為堆。

對於大根堆,調整方法為:若【根節點的關鍵字】小於【左右子女中關鍵字較大者】,則交換。

之後向前依次對各節點((n-2)/2 - 1)~ 0為根的子樹進行調整,看該節點值是否大於其左右子節點的值,若不是,將左右子節點中較大值與之交換,交換後可能會破壞下一級堆,於是繼續採用上述方法構建下一級的堆,直到以該節點為根的子樹構成堆為止。

反覆利用上述調整堆的方法建堆,直到根節點。

4.堆排序:(大根堆)

①將存放在array[0,…,n-1]中的n個元素建成初始堆;

②將堆頂元素與堆底元素進行交換,則序列的最大值即已放到正確的位置;

③但此時堆被破壞,將堆頂元素向下調整使其繼續保持大根堆的性質,再重複第②③步,直到堆中僅剩下乙個元素為止。

堆排序演算法的效能分析:

空間複雜度:o(1);

時間複雜度:建堆:o(n),每次調整o(log n),故最好、最壞、平均情況下:o(n*logn);

穩定性:不穩定

建立大根堆的方法:

1

//構建大根堆:將array看成完全二叉樹的順序儲存結構

2private

int buildmaxheap(int array)

7return

array;

8 }

910//將元素array[k]自下往上逐步調整樹形結構

11private

void adjustdowntoup(int array,int k,int length)

17if(temp>=array[i])else

23 }

24array[k] = temp; //被調整的結點的值放人最終位置

25 }

堆排序:

1

//堆排序

2public

int heapsort(int array)

10return

array;

11 }

刪除堆頂元素(即序列中的最大值):先將堆的最後乙個元素與堆頂元素交換,由於此時堆的性質被破壞,需對此時的根節點進行向下調整操作。

1

//刪除堆頂元素操作

2public

int deletemax(int array)

對堆的插入操作:先將新節點放在堆的末端,再對這個新節點執行向上調整操作。

假設陣列的最後乙個元素array[array.length-1]為空,新插入的結點初始時放置在此處。

1

//插入操作:向大根堆array中插入資料data

2public int insertdata(int array, int data)else

14 }

15array[k] = data; //將插入的結點放到正確的位置

16return

array;

17 }

java實現堆排序

許多應用要用堆,比如,優先佇列,即佇列的擴充,佇列的每個元素增加乙個稱為優先順序的字段,優先佇列可以是線性結構的,但要有較高的效率,應把它組織成堆結構。元素入隊是,相當於執行堆的插入演算法 但在隊頭每次刪除的總是隊頂具有最大優先順序的元素,因此可以把它稱為最大優先順序佇列。再比如,堆排序是選擇排序中...

堆排序java實現

公升序用大根堆,降序用小根堆 調整堆 從根節點開始向下調整堆 先建立初始堆,從n 2 1 第乙個非葉子節點 節點開始,將之看做根節點,向下調整堆,到根節點結束 迴圈i from n 1 to 0,每次取出堆的最頂層根節點,即陣列下標為0,然後與節點i交換,這樣對於大根堆而言,最大值總是在後面,再從根...

Java 實現堆排序

堆排序主要是利用堆在根節點上的特性,既在大頂堆的情況下,堆的第乙個元素是堆當中最大的元素,而在小頂堆的情況下,堆的第乙個元素是最小的節點。所以在堆排序的過程,主要的操作就是對每次取出堆頂的元素之後 在這裡使用大頂堆 我們就選出了堆中的最大元素,然後對堆剩下的元素進行再次進行大頂堆的調正,得到乙個新的...