定义
- 堆
- 堆是一棵完全二叉树
- 树中每个结点的值均不大于(或不小于)左右孩子结点的值
- 一般使用优先队列实现
向下调整
- 因为向下调整默认调整的节点后面的都是排好序的,所以在使用向下调整时,都是从后往前
//向下调整:把欲调整结点与子节点比较
void downAdjust(int low,int high)
{
int i = low, j = 2 * i;//j是左孩子结点
while (j <= high)//i存在孩子
{
if (j + 1 <= high && heap[j + 1] > heap[j])
{
j = j + 1;
}
if (heap[j] > heap[i])
{
int temp = heap[j];
heap[j] = heap[i];
heap[i] = temp;
i = j;
j = 2 * i;
}
else
{
break;
}
}
}
建堆
//建堆
void createHeap()
{
for (int i = n / 2; i >= 1; i--)
{
downAdjust(i, n);
}
}
删除栈顶
//删除栈顶 把最后一个元素放在栈顶 然后向下调整
void deleteTop()
{
heap[1] = heap[n--];
downAdjust(1, n);
}
向上调整
//向上调整 把当前节点与父亲节点作比较
void upAdjust(int low,int high)
{
int i = high, j = i / 2;
while (j >= low)
{
if (heap[i] <= heap[j])
{
//交换
int temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
i = j;
j = i / 2;
}
else
{
break;
}
}
}
添加元素
//添加元素:添加到末尾后,进行调整
void insert(int v)
{
heap[++n] = v;
upAdjust(1, n);
}
堆排序
//堆排序 取出每次最值(栈顶)放在最后,将未排序的元素的末尾放在栈顶,进行向下调整
void heapSort()
{
createHeap();
for (int i = n; i >1; i++)
{
int temp = heap[1];
heap[1] = heap[i];
heap[i] = temp;
downAdjust(1, i-1);
}
}