堆的添加元素的三种方法
https://www.bilibili.com/video/BV1Xi4y1s7nu/?spm_id_from=333.788.videocard.0
#include<iostream>
using namespace std;
//堆的插入
//方法1:交换法
int heap[200];//堆数组
int len;//堆的长度
void insert(int x)//把元素x插入最小堆
{
heap[++len] = x;//插入堆尾
int pa, son;//下标指针
son = len, pa = son / 2;//son指向堆尾,pa指向其上一层的父节点
while (son > 1)
{
if (heap[son] >= heap[pa]) break;
swap(heap[son], heap[pa]);//调用交换函数
son = pa, pa = son / 2;//下标上浮
}
}
//方法二:下移法(比交换元素更快)
int heap[200];
int len;
void insert(int x)
{
int pa, son;
son =++ len, pa = son / 2;//先把堆的长度加1 ,使得son指向堆尾的空结点
while (son > 1)
{
if (x >= heap[pa]) break;//合适位置不变动
heap[son] = heap[pa];//不然就将父亲元素赋值给儿子元素
son = pa, pa = son / 2;//下标上浮
}
heap[son] = x;//插入x
}
//方法三 :哨兵法(效率更高)
int heap[200];
int len;
void insert(int x)
{
int pa, son;
heap[0] = -10000;//设置一个足够小的数字 作为哨兵
son = ++len, pa = son / 2;
while (x < heap[pa])
{
heap[son] = heap[pa];//上面元素下移
son = pa, pa = son / 2;//下标上浮
}
heap[son] = x;//插入x
}
int main()
{
return 0;
}
#include<iostream>//哨兵法
using namespace std;
const int N = 7;
int a[N] = { 3,5,1,7,6,4,2 };
int heap[200];
int len;
void insert(int x)
{
int pa, son;
heap[0] = -10000;
son = ++len, pa = son / 2;
while (x < heap[pa])
{
heap[son] = heap[pa];
son = pa, pa = son / 2;
}
heap[son] = x;
}
int main()
{
for (int i = 0; i < N; i++) insert(a[i]);//建立小根堆
for (int i = 1; i <= N; i++) cout << heap[i] << " ";//输出堆
return 0;
}