演算法導論第六章偽碼轉C

2021-06-26 04:50:31 字數 1674 閱讀 1629

heap.h:

#include

using namespace std;

class fheap

;int parent(int i)  //從0索引,i/2變成(i-1)/2 

int leftchild(int i)  //從0索引, 2*i 變成2*i + 1 

int rightchild(int i)//從0索引 2*i + 1變成2*i + 2 

void fswap(int& a, int& b)

//維護堆的函式,預設條件在p85,預設根節點為left[i]和right[i]的二叉樹

//都是最大堆,所以建堆需要那樣從最後乙個父節點倒著依次

//這種條件導致要維護的節點小於其父節點,否則應該維護其父節點 

//當滿足這種條件只是節點大於其父節點,則應該再維護其父節點,實際建堆就是這麼幹的 

void max_heapify(int a, int i, int n)

開始的陣列時與課本上從1開始規律不同 

int r = rightchild(i);

//這裡建堆時存在越界問題,比如10個數從10/2=5,右子11,a[11]越界

//所以要求,l,r小於n,用從1開始的陣列,是小於等於,可防止越界 

//cout << "l,r " << l << "," << r << endl;

int largest;

if ( (l < n) &&(a[l]> a[i]))

largest = l;

else largest = i;

if ((r < n) && (a[r] > a[largest]))

largest = r;

//cout << "largest,i :" << largest << " " << i << endl;

if (largest != i)

}void build_max_heap(int a, int n)

void heap_sort(int a, int n)

} int heap_maximum(int a) 

int heap_extract_max(int a, int n)

int max = a[0];

a[0] = a[n - 1];//異

n = n - 1;

max_heapify(a,0,10);//0異 

return max;

}void heap_increase_key(int a,int i, int key, int n)

}void max_heap_insert(int a,int key, int n)

main.cpp

#include

#include"heap.h"

using namespace std;

void showheap(int a,int n)

int main()

;build_max_heap(a,10);

showheap(a,10);

heap_increase_key(a,8,15,10); //8是a[8] 

showheap(a,10);

max_heap_insert(a,13,10);//把元素13插入堆 

showheap(a,10);

return 0;

}

演算法導論 第六章學習筆記

從第六章開始,我們開始了第二部分排序和排序統計學的學習。第六章介紹的是堆排序,本章講了以下幾個內容 1 介紹堆的概念,以最大堆為例 2 保持堆性質的演算法max heapify 3 建堆的演算法build max heap 4 堆排序演算法heapsort 5 優先順序佇列 1 堆 定義 二叉 堆資...

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

本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...

演算法導論 第六章 堆排序

二叉 堆資料結構是一種陣列物件,如下圖所知,他可以被視為一顆完全二叉樹。其有如下性質 1 對於i節點 i表示下標 其父節點為li 2 左孩子節點為2i,右孩子節點為2i 1 2 最大堆滿足 a parent i a i 最小堆滿足 a parent i a i 3 堆的高度為 lgn 4 子陣列元素...