堆排序詳解(包會)

2021-10-08 22:32:46 字數 989 閱讀 4131

二叉堆(也叫堆)是乙個部分排序的二叉樹,其排序規則體現在它的堆序性質上:最大堆和最小堆,最大堆就是其對於任一節點,每個節點的鍵值都大於等於它的孩子節點,所以根節點鍵值最大。最小堆則相反。

堆是一棵完全二叉樹,具備完全二叉樹的性質,可以用乙個陣列表示而不需要指標,在起始位置為 0 的陣列中任一位置 i 上的元素,其左兒子在位置 2*i+1 上,右兒子在左兒子的後面鄰近位置上,它的父節點則在位置 (i-1)/2。因此,乙個堆資料結構將由乙個陣列(不管鍵值是什麼型別)乙個代表最大容量的整數以及當前的堆大小組成。

#include

#include

//對當前節點進行調整,這樣得到乙個大頂堆

void

heapadjust

(int

*k,int n)

//引數n為陣列的最大下標,不是陣列長度

if(k[i]

< k[

2* i+2]

&&(2* i +2)

<= n)}}

//將堆排序後陣列的根節點和最後乙個節點的值互換

void

swap

(int

*k,int i,

int j)

//堆排序

void

heapsort

(int

*k,int n)

//引數n為陣列的長度

}int

main()

;heapsort

(arr,10)

;printf

("排序後的結果是:\n");

for(

int i =

0; i <

10; i++

)return0;

}

堆排序的實現就是三個函式。

由於堆排序比較簡單,這裡就只提供**。相信你自己肯定看的懂!!!

排序詳解 堆排序

堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...

堆排序詳解

一 堆的定義 堆的定義如下 n個關鍵字序列l n 成為堆,當且僅當該序列滿足 l i l 2i 且l i l 2i 1 或者 l i l 2i 且l i l 2i 1 其中i屬於 1,n 2 滿足第 種情況的堆稱為小根堆 小頂堆 滿足第 種情況的堆稱為大根堆 大頂堆 在大根堆中,最大元素存放在根結點...

堆排序詳解

public class heapsort 此時已經完成了最大堆的構建,下面進行排序。for int i len 1 i 0 i 維護最大堆,保證父節點大於等於子節點 public static void maxheapify int a,int index,int len if rightchil...