一、簡單了解堆
如果有乙個關鍵碼的集合k = ,把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:ki <= k21+1 且 ki <= k2i+2(ki >= k2i+1 且 ki >= k2i+2) i = 0,1,2...,則稱為小堆(或大堆)。將根結點最大的堆叫做最大堆或大根堆,根結點最小的堆叫做最小堆或小根堆。
堆的性質:
·堆中某個節點的值總是不大於或不小於其父節點的值;
·堆總是一棵完全二叉樹。
二、堆的實現
具體實現:
1.堆的向下調整:將堆變成小堆或大堆(前提:調整的樹左右子樹必須是乙個堆,才能調整)
2.對的建立:從倒數第乙個非葉子節點的子樹開始調整,一直調整到節點的樹,就可以調整成堆。
3.堆的插入:先插入乙個值到陣列的尾上,再進行向上調整的演算法,直到滿足堆。
4.堆的刪除:刪除堆是刪除堆頂的資料,將堆頂的資料和最後乙個資料一換,然後刪除陣列最後一資料,再進行向下調整演算法。
5.堆排序:結合了建堆和向下調整,先建堆然後將堆頂元素和陣列最後乙個元素交換,再將堆頂元素進行向下調整,直到排好序。
三、**實現
#pragma once
#include #include //向下調整
//array[size]表示陣列及大小
//root表示要調整的結點的下標
//前提是[root]所在結點左右子樹已經滿足堆的性質
void adjustdown(int array, int size, int root)
//確定那個是最小的孩子
if (min+1 < size && array[min+1] < array[min])
if (array[root] <= array[min])
//交換值
int tmp = array[root];
array[root] = array[min];
array[min] = tmp;
adjustdown(array, size, min);
}//建堆
void createheap(int array, int size)
}typedef int hpdatatype;
typedef struct heap
heap;
//初始化
void heapcreateheap(heap* heap, int array, int size)
//建堆
createheap(heap->array, heap->size);
}//小堆
void adjustup(int array, int size, int child)
int tmp = array[parent];
array[parent] = array[child];
array[child] = tmp;
child = parent; }}
//增加
void heapinsert(heap* heap, int val)
//刪除(只能刪除堆頂元素)
//堆排序
void heapsort(int *array, int size)
}//返回堆頂元素,返回最值
hpdatatype heaptop(heap* heap)
用陣列實現 堆 演算法
堆有大頂堆,小頂堆 大頂堆保證堆頂元素為堆中最大值,小頂堆相反。大頂 堆的特性是父節點的值大於子節點的值。對於堆來說 class heap array top return array 0 push while index 0 droptop exchage array 0 array size 1...
用堆實現優先佇列
堆的性質 1.乙個是他是乙個陣列 當然你也可以真的用鍊錶來做。2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize 2個。3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i 2,他的左孩子結點就是i 2,右孩子結點就是i 2 1,如果下標從0開始,要...
用堆實現優先佇列
話不多說,先上 include include 定義乙個堆得結構體,struct myheap 調整資料,維持堆得性質,這個和上次heapify的作用一樣 只是這個時從子道父節點這樣的判斷而已。int increasekey myheap pheap,int npos else 否則堆沒有被破壞,退...