堆是一种特殊的完全二叉树,所有父点都比子结点要小称最小堆,反之,所有父点都比子结点大的成为最大堆。用堆来排序、删除、增加效率都比较高。另外用堆来求第K大数和第K小数都比较方便。只需要建立一个大小为K的堆,堆顶就是要求的第K大或第K小。
例如:
有5个数,要求第3小的数。首先任取三个数,例如前三个建立最大堆,然后从第4个数开始与堆顶比较,若比堆顶大,那么这个数就不要,若比堆顶小就和堆顶交换,重新调整为最大堆。后面的数照此循环知道结束,此时堆顶就是第3小数。
代码后面↓:
#include<iostream>
using namespace std;
const int MAX = 10000;
int h[MAX];
int n, k;
void swap(int i, int j)
{
int t = h[i];
h[i] = h[j];
h[j] = t;
}
//向下调整
void siftsort(int x)
{
int t, flag = 0;
while (2 * x <= k&&flag == 0)
{
if (h[x] < h[2 * x])//与左孩子判断大小
t = 2 * x;
else
t = x;
if (2 * x + 1 <= k)//是否有右孩子
{
if (h[t] < h[2 * x + 1])//上面判断完的值再与右孩子判断
t = 2 * x + 1;
}
//若父亲点比孩子点小
if (t != x)
{
swap(t, x);
x = t;
}
else
flag = 1;
}
}
//与堆