上次用Java实现了最大堆的封装,这次就来写一下最小堆的实现吧
插入函数的思路:
向堆中插入元素有两种情况,一种是堆为空,那么就让插入值作为根节点即可;另一种是堆不为空,那么此时就要进行判断当前节点与其父节点的大小关系比较。此时仍有两种情况,一种是当前节点大于父节点,这样正是我们所希望的;另一种是当前节点的值小于父节点,那么就要将二者的值进行调换,然后记得更新当前节点为原来父节点的位置,而父节点的位置同样需要更新(循环正常终止的时候说明已经到了根节点,此时最小值必定为根节点)
bool Insert(T data){ if(currentPos==MaxSize){ cout<<"Sorry , this heap is full!"<<endl; return false; } currentPos++; int targetPos=currentPos-1; heap[targetPos]=data; while(targetPos>0){ int parentPos=(targetPos-1)/2; if(heap[parentPos]<heap[targetPos]){ break; }else{ heap[targetPos]=heap[parentPos]; targetPos=parentPos; } } return true; } //存在的bug是对根节点的大小比较,因为有可能targetPos=0而退出,此时就缺少了一次比较
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
siftDown调整过程思路:
给定要进行调整的节点的下标,我们只需要让它和它的两个子节点中最小的那个比较即可(前提是当前节点不是叶子节点),