《演算法導論》 第6章堆排序

2021-06-07 07:52:12 字數 1371 閱讀 4738

#include

#include

using namespace std;

定義結構體,其中包含陣列長alength,堆長heap_size。

struct dui

};//返回堆中元素i的父結點的下標;i/2向下取整,即i進行左移一位操作。。

int parent(int i)

;//返回堆中元素i的左孩子的下標;i*2+1.因陣列有下標0;

int left(int i)

;//返回堆中元素i的右孩子的下標;i*2+2.因陣列有下標0;

int right(int i)

;//保持堆的性質 /*

max_heapify是對最大堆進行操作的重要的子程式,其輸入為乙個結構體為陣列a和下標i,當max_heapify被呼叫時,我們假定以left(i)和right(i)為根的兩棵二叉樹都是最大堆,但這時a[i]可能小於其子女,這樣就違反了最大堆性質,max_heapify讓a[i]在最大堆中「下降」,使以i為根的子樹成為最大堆。 */

void max_heapify(dui &sample,int i)

};//構造堆排序。即建堆過程。

/*我們可以自底向上地用max_heapify來將乙個陣列a[1...n]變成乙個最大堆。子陣列a[parent(alength)..n]中的元素老師樹中的葉子,因此每個都可看作是只含乙個元素的堆。過程built_max_exap對樹中的每乙個其他結點都呼叫max_heapify。 */

void build_max_heap(dui &sample)

}//資料交換

void exchange(int &a,int &b)

//進行堆排序 /*

開始時,堆排序演算法先用uiltd_max_heap將輸入陣列a[0...n]構造成乙個最大堆。因此陣列中最大元素在根a[0],則可以通過把它一a[n]互換來達到最終正確的位置。現在,如果從堆中「去掉」結點n(通過減小heap_size),可以很容易地將a[0..n-1]建成最大堆。原來根的子女仍是最大堆,而新的根元素可能違背 了最大堆習。這時呼叫max_heapify就可以保持這一性質。在a[a..n-1]中構造出最大堆。堆排序演算法不斷重複這個過程,堆的大小由n-1一直降到1(下標為0) */

void heapsort(dui &sample)

}void main()

;//heap_size = 10-1;

//alength = 10;

dui sample;

sample.a = a;

sample.alength = 10;

sample.heap_size = 9;

heapsort(sample);

for(int i = 0;i<10;i++)

cout<

演算法導論第6章 堆排序

本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。1 堆 堆給人的感覺是乙個二叉樹,但是其本質是一種陣列物件,因為對堆進行操作的時候將堆視為一顆完全二叉樹,樹種...

《演算法導論》筆記 第6章 堆排序

第6章 堆排序 本章主要介紹了堆的基本知識和幾個基本操作過程 堆 二叉 堆資料結構是一種陣列物件,它可以被看作是一棵完全二叉樹。heap size a 即堆的大小是已知的,樹的根結點是a 1 某個i結點,它的父結點parent i 為,左兒子left i 和右兒子right i 的下標可以簡單地計算...

《演算法導論》筆記 第6章 6 4堆排序演算法

反覆將大根堆的根與最後乙個結點交換,堆的大小減一,對根結點執行max heapify維護堆的性質。最終 a 陣列按公升序排列。void heapsort 6.4 1 說明 heapsort 在陣列 a 5,13,2,25,7,17,20,8,4 上的操作過程。6.4 2 討論在使用如下迴圈不變式時,...