堆排序(公升序,降序,迭代,遞迴寫法)

2021-10-09 01:37:16 字數 1936 閱讀 6641

是一種選擇排序。 平均時間複雜度為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 堆調整過程 將初始堆調整為最大堆 最大堆定義 每個節點的值都...