最大堆排序 C

2021-08-19 01:16:44 字數 1396 閱讀 7236

堆排序是一種複雜度為o(nlog(n))的一種高效的排序,這裡將展示最大堆的排序演算法。

堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對:a[10]=

抽象的二叉樹結構如下:

1、下面三個節點是得到左子節點,右子節點,和父節點。

intleft(

inti)

//返回左兒子

intright(

inti)

//返回右兒子

intparent(

inti)

//返回父節點

比如呼叫left(1),就是找a[1]的左子節點,就返回3

2、下面這個函式maxheapify是將父節點的數和子節點的數對比,將最大的數移動到父節點上。在調換的子節點作為新的父節點實現相同的操作。如執行maxheapify(a,0),先將右子節點的數13和父節點10進行交換:

被調換的子節點10進行遞迴呼叫maxheapify(a,2),於是和左子節點的數進行交換:

**如下:

void

maxheapify(

inta,

inti,

intn)

//將i節點為根的堆中小的數依次上移,n表示堆中的資料個數

return;}

3、建立最大堆:

在這道題中,依次對8,2,12,1,0即是a[4],a[3],a[2],a[1],a[0]呼叫maxheapify函式,就可以得到最大堆,即是從:

for i=(n-1)/2 to 0:

maxheapify(a,i)

就可以實現最大堆。

void

buildmaxheap(

inta,

intn)

//建立最大堆

最後就是排序的過程,將第乙個數踢出來,最後乙個數放到第乙個上,對剩下的數呼叫maxheap

ify,就可以得到降序的排列:

void

heapsort(

inta,

intn)

//堆排序演算法

}主函式:

intarray

[10] = ;

heapsort(

array

, 10);

結果如下:

最大堆 排序

解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...

最大堆排序

其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...

最大堆實現堆排序

堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...