今天我來介紹一下堆的基本演算法和它的一些簡單應用。
一 。基本演算法:
#pragma once
#include#include#include#include#includetypedef struct heapheap;
//堆的初始化。
void heapinit(heap *ph,int array,int size)
//交換函式。
void swap(int *a,int *b)
//向下調整求大堆的遞迴法。
void adjustdown(heap *ph,int parent)
max=left; //假設最大值是左子樹。
if(rightsize && ph->array[right]>ph->array[left]) //如果右子樹存在並且比左子樹大,就讓最大值為右子樹。
if(ph->array[max]>ph->array[parent]) //如果最大值大於要調整節點,就進行交換。
else
adjustdown(ph,max); //遞迴進行這個操作即可。
}//向下調整求大堆的非遞迴法。
void adjustdownloop(heap *ph,int parent) //總體上與遞迴一樣,只是加了乙個迴圈。
max=left;
if(rightsize && ph->array[right]>ph->array[left])
if(ph->array[max]>ph->array[parent])
else
parent=max; }
}//造大堆。
void makeheap(heap *ph)
}//求堆頂元素。
int heaptop(heap *ph)
//求堆的元素個數。
int heapcount(heap *ph)
//判空。1為空,0不為空。
int heapisempty(heap *ph)
//出堆。
//向上調整遞迴法。
void adjustup(heap *ph,int child)
if(ph->array[child]>ph->array[parent]) //如果調整節點大於父節點,則進行交換。
else
adjustup(ph,parent); //遞迴執行。
}//向上調整非遞迴。
void adjustuploop(heap *ph,int child)
if(ph->array[child]>ph->array[parent])
else
child=parent; }}
//入堆。
二。簡單應用:
//建大堆非遞迴法。
void adjustarray(int array,int size,int root)
max=left;
if(rightarray[left])
if(array[max]>array[root])
else
root=max; }}
//在array中找到最小的k個數。
int *find(int array,int size,int k)
i=k;
while(i=0;i--) //建大堆。
for(i=0;i
三。除錯結果:
int main()
; //要進行調整的陣列。
int size = sizeof(array) / sizeof(int); //求元素個數。
heapinit(&heap, array, size); //先初始化。
makeheap(&heap); //建堆。
printf("原始堆為:");
for (i = 0; i < heap.size; i++)
printf("\n");
printf("入堆後的新堆為:");
for (i = 0; i < heap.size; i++)
printf("\n");
printf("出堆後的新堆為:");
for (i = 0; i < heap.size; i++)
printf("\n");
printf("堆頂為%d\n",heaptop(&heap)); //輸出堆頂元素。
printf("堆的元素個數為%d\n",heapcount(&heap)); //輸出堆的元素個數。
printf("\n");
printf("最小的3個數為:");
以上就是有關堆的問題,謝謝參觀。
堆操作及應用
1.堆是乙個完全二叉樹,堆主要設計到的操作有插入,刪除,堆化。2.堆的主要應用有堆排序 從小到大排序,使用大頂堆 從大到小排序,使用小頂堆。3.下面以大頂堆為例,給出實現 view code 1 include 2 include 3 4using namespace std 56 大頂堆的實現 7...
資料結構 堆及堆的應用
堆是一種特殊的樹形結構,堆的把每乙個節點都有乙個值,我們通常所說的堆這種資料結構,指的就是二叉堆。其實它可以被看做乙個完全二叉樹。它的每個節點的子樹又可以被看做是堆。堆可以分為最大堆和最小堆 最大堆 每個父節點都大於孩子節點 最小堆 每個父節點都小於孩子節點 a 我們在定義堆的資料成員的時候,利用s...
資料結構 堆及堆的應用
1.堆 把一組資料按照完全二叉樹的順序儲存模式儲存在乙個二維陣列中,若ai 若ai ai 1 ai ai 2,則稱為大堆 i 0,1,2.n 在堆中,若設父親節點為parent,則它的左孩子為2 parent 1,右孩子為2 parent 2 void makeheap datatype a,siz...