是一種選擇排序。 平均時間複雜度為0(nlogn),是不穩定排序
大頂堆: 完全二叉樹,每個節點的值都大於或等於其左右子節點的值。(左右子節點的值不作要求)
小頂堆:完全二叉樹,每個節點的值都小於或等於其左右子節點的值
將待排序序列構造層乙個大頂堆 (左節點2n+1; 右節點2n+2; 父節點(i-1)/2)
序列的最大值處於,頂部的根節點
先將陣列變成大頂堆形式
將大頂堆堆頂與最小葉子節點交換,使大頂堆位於最小葉子節點除,將其移除(後面不考慮)
在對其剩餘頂堆進行處理,使其重新變成大頂堆
迴圈4-5,直至所有元素被移除
公升序
class
heapsort
}// 將乙個陣列變成大堆頂形式
public
static
void
bigheap
(int
arr)}}
// 將其重新變成大堆頂形式
// 迭**法
public
static
void
heaprest
(int
arr,
int index,
int size)
else
// 如果子節點的最大值大於父節點,則進行交換
if(arr[bigindex]
> arr[index]
)else}}
// 將其重新變成大堆頂形式
// 遞迴寫法
public
static
void
heaprestrec
(int
arr,
int index,
int size)
if(right
> arr[left]
)else
if(arr[bigindex]
> arr[index])}
public
static
void
swap
(int
arr,
int ind1,
int ind2)
public
static
void
main
(string[
] args)
;heapsort
(arr)
;for
(int e: arr)}}
降序:public
static
void
heapsortdescent
(int
arr)
}// 將陣列轉換為小頂堆
public
static
void
smallheap
(int
arr)}}
// 將剩餘陣列轉換為小頂堆
private
static
void
smallheapres
(int
arr,
int index,
int size)
if(right < size && arr[right]
)else
if(arr[index]
> arr[smallind])}
public
static
void
main
(string[
] args)
;heapsortdescent
(arr)
;for
(int e: arr)}}
堆排序(遞迴 迭代三種寫法)
具體的演算法流程可以參考 排序演算法 三 之堆排序 堆排序的基本思路 這裡重點討論下調整堆結構這個操作,這個結構是建立在大頂堆已經建立的基礎上的,有遞迴和迭代兩種方法。遞迴方法 public void heapify int arr,int n,int i 非遞迴方法 public void adj...
氣泡排序公升序降序
氣泡排序 時間複雜度 o n2 實 質 把小 大 的元素往前 後 調 氣泡排序演算法的原理如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次...
堆排序(公升序)
1 思想 堆即是一棵完全二叉樹。堆排序的核心是堆調整演算法。首先根據初始輸入資料,利用堆調整演算法shiftdown 形成最大堆 然後,將堆頂元素與堆尾元素交換,縮小堆的範圍並重新調整為最大堆,如此往復。堆排序是一種不穩定的排序演算法。2 堆調整過程 將初始堆調整為最大堆 最大堆定義 每個節點的值都...