排序演算法之堆排序及Java實現

2021-08-19 08:14:13 字數 1901 閱讀 7988

選擇排序(直接選擇排序,堆排序)

交換排序(氣泡排序,快速排序)

插入排序(直接插入排序,希爾排序)

歸併排序

桶式排序

基數排序

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序。堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。

它的基本思想是將待排序的序列構造成乙個大頂堆(或小頂堆)。此時,整個序列的最大值就是堆頂的根節點,將其與堆陣列的末尾元素交換,此時末尾元素就是最大值,然後將剩餘的 n-1 個序列重新構造成乙個最大堆,再將新的最大堆的頂與末尾元素交換,如此反覆執行,便能得到乙個有序序列了。

堆排序中重要的乙個部分是不斷調整堆使其滿足最大堆的性質,即父節點都比子節點的值大。調整最大堆的演算法如下所示,輸入為乙個陣列a和乙個下標i,它用來維護以下標i為根結點的子樹最大堆的性質,通過讓a[i]的值在最大堆中「逐級下降」,從而使得以下標i為結點的子樹重新遵循最大堆的性質。

之後用置底向上的方法利用max-heapify把乙個大小為n=a.length的陣列a[1~n]轉化為最大堆。演算法如下所示,原理很簡單,就是從倒數第2層開始,呼叫max-heapfy方法,直至到根結點。

最後是取出最大值的演算法,也就說將最大堆的頂值與最後乙個節點值交換,這樣最後乙個節點就變成了最大值,再將前n-1個值重新進行最大堆排序。演算法如下所示,首先將待排序的陣列構建為最大堆陣列,之後遍歷整棵樹,每次遍歷「取出」根結點,再呼叫max-heapify維護子樹的最大堆性質。這樣就能保證遍歷時每次「取出」的元素是當前剩餘元素中最大的。

實現**如下所示:

public

class

heapsort

}/**

* 4 3 9 5 10 2 6

* 0 1 2 3 4 5 6

* * 4

* 3 9

* 5 10 2 6

* *@param arr 待排序的陣列

*@param index 要進行調整的節點位置

*@param heapsize 最大堆的大小

*/public

static

void

maxheapify(int arr, int index, int heapsize) else

if (rightindex < heapsize && arr[rightindex] > arr[largeindex])

if (largeindex != index)

}//建立最大堆,遍歷其中的非葉子節點,調整位置,達到最大堆的特點,即父節點的值大於子節點的值

public

static

void

buildmaxheap(int arr)

}public

static

void

main(string args);

heapsort(test);

for(int i=0; i" ");}}

}

測試結果:

2 3 4 5 6 9 10

排序演算法之堆排序java實現

堆排序 heap sort 的基本思想是迴圈執行如下過程直到陣列為 空 什麼是最大堆?堆是乙個具有這樣性質的順序二叉樹,每個非葉子節點的關鍵字大於等於它的孩子結點的關鍵字。顯然在乙個堆中,根節點具有最大值,而且堆中任何乙個結點的非空左 右子樹都是乙個堆,它的根節點到任一葉子的每條路徑上的節點都是遞減...

Java實現 高效排序演算法之堆排序

堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。在處理堆排序時面臨兩個問題 乙個是如何建堆。另乙個是如何在輸出堆頂後進行調整,成為乙個新堆。建堆的過程主要是通過在n 2 取下限 處開始,反覆進行 篩選 的過程。具體過程見演算法分析及注釋。堆排序的偽 heapsort data...

堆排序 及Java實現

在學習堆排序之前需要了解什麼是堆?堆是一顆完全二叉樹,什麼是完全二叉樹?若二叉樹的深度為h,除了第h層外,其他各層的節點數都達到最大個數,第h層所有的節點都連續集中在最左邊,這就是完全二叉樹。堆分為兩種 大根堆和小根堆 大根堆 在完全二叉樹的基礎上,根節點是最大的值,每個父節點都比自己的兩個子結點大...