我們知道在c語言中也有乙個名字叫做堆,那麼在資料結構中的堆和c語言中的堆一樣嗎?
答案是:no
c語言中的堆:其實是因為有一堆東西在此放著,所以起名為堆
資料結構的堆:如果有乙個關鍵碼的集合k=,把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:ki<=k2*i+1 且 ki<=k2*i+2 (ki>=k2*i+1 且 ki>=k2*i+2) i=0,1,2...則稱為小堆(大堆)
幾個公式:
parent=(child-1)/2 左孩子:child=2*parent+1 右孩子:child=2*parent+1 +2
一、堆的建立:(物理儲存是乙個順序表,邏輯上是完全二叉樹)
將二叉樹調整為最小堆的原理:
從最後乙個非葉子結點開始調整,一直到跟結點為止,將每個結點及其子樹調整到滿足小堆的性質即可
最後乙個非葉子結點就是最後乙個葉子結點的雙親:[(size-1)-1/2,0] 最後乙個下標為size-1
我們採用向下調整的方法進行堆的建立:
是乙個持續向下走的過程
1.當前到調整的是葉子結點
2. 當前要調整的已經滿足堆的性質
我們用**實現以下大堆的建立:
先初始化堆
//初始化
void heapinit(heap *ph, int array,int size)
堆的建立
//交換資料
void swap(int *a, int *b)
//向下調整(大堆)
void adjustdown(heap *ph, int parent)
// 肯定有左孩子,右孩子可能有,可能沒有
// 找出誰是大的孩子
maxchild = left;
if (right < ph->size && ph->array[right] > ph->array[left])
if (ph->array[parent] > ph->array[maxchild])
swap(ph->array+parent, &(ph->array[maxchild]));
//adjustdown(ph, maxchild);
parent = maxchild; }}
//建堆
void heapmake(heap *ph)
}
二、堆的刪除方法:1.將堆中最後乙個元素替代堆頂元素2.將棧中元素減少乙個,相當於將堆中最後乙個元素刪除3.此時堆結構可能被破壞,在向下調整使其滿足堆的性質
**如下~
//刪除
三、堆的插入方法:在建立好的堆後面,插入之後,可能不滿足堆的性質,採用向上調整的方法就行調整**看這裡~
//向上調整
void adjustup(heap *ph, int child)
if (ph->array[parent] > ph->array[child])
swap(ph->array + parent, ph->array + child);
child = parent; }}
//插入
void heapinsert(heap *ph, int data)
程式所有源**:
#pragma once
#include#include#include#include#define max_size 100
typedef struct heapheap;
//交換資料
void swap(int *a, int *b)
//向下調整(大堆)
void adjustdown(heap *ph, int parent)
// 肯定有左孩子,右孩子可能有,可能沒有
// 找出誰是大的孩子
maxchild = left;
if (right < ph->size && ph->array[right] > ph->array[left])
if (ph->array[parent] > ph->array[maxchild])
swap(ph->array+parent, &(ph->array[maxchild]));
adjustdown(ph, maxchild);//遞迴
//parent = maxchild;
//}}//建堆
void heapmake(heap *ph)
}//初始化
void heapinit(heap *ph, int array,int size)
//堆頂元素
int heaptop(heap *ph, int array, int size)
//元素個數
int heapsize(heap *ph, int array, int size)
//判空
int heapisempty(heap *ph, int array, int size)
//刪除
//向上調整
void adjustup(heap *ph, int child)
if (ph->array[parent] > ph->array[child])
swap(ph->array + parent, ph->array + child);
child = parent; }}
//插入
void heapinsert(heap *ph, int data)
void test()
; int size = sizeof(array) / sizeof(int);//求元素個數
heapinit(&heap,array, size); //初始化
heapmake(&heap);
int i;
for (i = 0; i < heap.size; i++)
printf("\n");
int j = heaptop(&heap, array, size);//堆頂
printf("堆頂為:%d\n", j);
int k=heapsize(&heap, array, size);//元素個數
printf("元素個數為:%d\n", k);
int a=heapisempty(&heap, array, size);//是否為空堆
printf("%d\n", a);
int h;
for (h = 0; h < heap.size; h++)
printf(" 刪除\n");
heapinsert(&heap, 90);//插入
int b;
for (b = 0; b < heap.size; b++)
printf(" 插入\n");
}
執行結果: 堆的建立,插入,刪除
堆的概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或者最大堆 其實這麼多乾乾的概念還是很不好理解的 先來說一下什麼是完全二叉樹 如果一顆具有n個結點的二叉樹的結構與滿...
堆的建立,插入,刪除,排序
堆是一種完全二叉樹,有最小堆和最大堆之分,最小堆是指根節點的值一定小於左子樹和右子樹所有元素的值,最大堆則相反 當你從小到大排序時,可以選擇最小堆反之,則選擇最大堆 1.如何建立乙個最小堆呢 由於堆是乙個完全二叉樹,所以滿足以下關係 我們將元素的順序從0開始排,第i個節點稱之為ki,那麼元素就有k0...
堆的建立 插入與刪除
堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為i的節點時 如果i 0,節點i是根節點 否則節點i的父節點為節點 i 1 2 如果2i 1 n 1,則節點i無左子女 否則節點i的左子女為2i 1 如果2i 2 n 1,則節點i無右子女 否則節點i的右子女為2i 2 typede...