重点:堆基础操作与堆相关算法思路。(仅个人学习记录,若有错误,感谢指正)
1、前言
熟练运用堆数据结构需要掌握的重点:
1、堆数据结构的定义
2、从上往下调整堆操作
3、从下往上调整堆操作
例如:
1、初始化堆:通过循环将每一个元素进行“从上往下调整”
2、堆排序:通过循环一次读取堆顶元素,并用最后一个元素代替,然后进行“从上往下调整”
3、插入元素:将元素插入堆,然后对新插入的元素进行从下往上调整,等等等。
所以,堆基础概念的理解以及熟练掌握堆基础操作对堆的灵活运动十分重要‼️
2、代码实现
1、堆数据结构定义
堆的数据结构
//数据结构定义
struct heap{
datatype data[MAX_NUMBBEr];
int size;
}
2、从下往上调整(大顶堆为例)
//从上往下调整,大顶堆为例
void adjustDown(struck heap* heap,int index,int size){
if(heap == NULL)
return;
//当索引指向叶子节点退出
while(index <= (heap->size-2)/2){
int left = 2*index+1,right = 2*index+2, temp;
//因为索引不指向叶子节点,所以必有左孩子
int max = heap[index]<heap[left]?left:index;
max = right<size&&heap[max]<heap[right]?right:max;
if(max == index) break;
else{
temp = heap[index];
heap[index] = teap[max];
temp[max] = temp;
index = max;
}
}
}