堆的基本演算法及應用。

2021-08-21 08:57:46 字數 2858 閱讀 7013

今天我來介紹一下堆的基本演算法和它的一些簡單應用。

一 。基本演算法:

#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...