演算法二 堆排序

2021-10-04 23:08:14 字數 1123 閱讀 9728

//堆排序,其複雜的為nlog(n)

#include

using

namespace std;

//交換陣列下標為i,j的元素

void

swap

(int tree,

int i,

int j)

//堆化,將陣列轉化為大頂堆 如:[4,10,3]-->[10,4,3]

//如果i節點進行了交換,為保證陣列的整個堆結構,必須對交換的節點繼續堆化,即遞迴堆化

void

heapify

(int tree,

int n,

int i)

//n為陣列大小,i為堆化節點位置

int c1 =

2* i +1;

//該節點的左子樹下標

int c2 =

2* i +2;

//該節點的右子樹下標

int max = i;

//獲取三個節點最大值位置,並將最大值置為堆頂

if(c1 < n && tree[c1]

> tree[max])if

(c2 < n && tree[c2]

> tree[max])if

(max != i)

}//對任意數組建堆,n為陣列大小

//從堆結構的倒數第二層開始,向上堆化

void

build_heap

(int tree,

int n)

}//將最後乙個節點與第乙個節點交換,去掉最後乙個節點,堆化第乙個節點

//迴圈操作直至剩下乙個節點即獲得從小到大排序的陣列。

void

heap_sort

(int tree,

int n)

}int

main()

;int i;

heap_sort

(tree,6)

;for

(i =

0; i <

6; i++

)printf

("\n");

system

("pause");

return0;

}

排序演算法(二) 堆排序

堆排序 堆是指每個節點值大於 小於其左右節點值的完全二叉樹,根節點一定是堆的所有節點中最大 小節點所在處 節點值大於左右節點值的堆叫大頂堆,根元素為整個堆的最大值。節點值小於左右節點值的堆 叫小頂堆。堆排序過程 1 將無序陣列構建成堆結構。2 將根節點值與最後乙個節點值互換,此時最後乙個節點值最大 ...

排序演算法二 堆排序

堆排序的時間複雜度為 o nlgn def max heapify lst,start,end 建立最大堆 root start while true child 2 root 1 左孩子 if child end break if child 1 end and lst child child 1...

演算法 堆排序(堆)

使用情形 插入乙個數 求集合當中的最小值 刪除最小值 刪除任意乙個元素 修改任意乙個元素 用一維陣列儲存二叉樹,左兒子在陣列中為根節點在陣列中的位置的2倍,右兒子在陣列中為根節點在陣列中的位置的二倍加一。求當前堆的最小值 void down int u 輸入乙個長度為n的整數數列,從小到大輸出前m小...