9.7.1 堆的定义与基本操作
向下排序:大的数字上位,本身就要大的数字,本身会有右边的数字> 左边的数字,则j=j+1
向上排序:小的数字上位,本身就要小的数字, 数组本身就是左边的值<右边的值,则不用比较,直接就是左边的
调整堆函数:
//设置最大值maxn为100
//heap为堆,n为元素个数
/*
1.对heap数组在[low,high]范围进行向下调整
2.low为欲调整的结点的数组下标,high一般为数组中最后一个结点的下标
3.void类型函数 downAdjust ,形参为int类型 low,high
4.int类型 i为low,j为i*2(即为左孩子)
5.while循环j<=high
1.如果j在倒数第1位即之前,且j的右孩子>左孩子
2.改变j的值为j+1
6.如果孩子中最大的权值比欲调整结点的i大
1.交换swap,俩个值
2.将i的值改为j
3.同时j的值改为i*2,表示此时i的左孩子
否则
1.直接退出循环
*/
const int maxn=100;
int heap[maxn],n=10;
void downAdjust(int low,int high)
{
int i=low,j=i*2;
while(j<=high)
{
if(j+1<=high && heap[j+1]>heap[j]) //对于j而言,先比较左右最大的
{
j=j+1;
}
if(heap[j]>=heap[i])
{
swap(heap[i],heap[j]);
i=j;
j=i*2;
}
else
{
break;
}
}
}
建堆:
//建堆
/*
void类型函数 createHeap
1.for,i从n/2开始,到i>=1,i--
2.调用downAdjust函数,参数为i,n
*/
void createHeap()
{
for(int i=n/2; i>=1; i--)
{
downAdjust(i,n);
}
}
删除堆顶元素:
//删除堆顶元素j
void deleteTop()
{
heap[1]=heap[n--]; //用最后一个元素覆盖堆顶元素,并让元素个数-1
downAdjust(1,n); //从1开始向下调整
}
在堆中添加一个元素
//对heap数组在[low,high]范围进行向上调整
//其中low一般设置为1,high为欲调整的结点数组下标
/*
void函数类型 upAdjust 形参为low high
1.i的值为high,j的值为i/2表示父亲结点
2.while循环:j>=low
1.如果欲调整的下标i,比它老子大
2.交换两个数
3.将i改为j
4.同时将j改为i的老子
3.否则就退出
*/
/*
添加元素x
void函数类型:参数为int类型x
1.对heap数组中,放入x
2.调用upAdjust函数,从1~n
*/
void upAdjust(int low, int high)
{
int i=high,j=i/2;
while(j>=low)
{
if(heap[i]>heap[j])
{
swap(heap[i],heap[j]);
i=j;
j=i/2;
}
else
{
break;
}
}
}
void insert(int x)
{
heap[++n]=x;
upAdjust(1,n);
}
9.7.2 堆排序:
/*
堆排序:
void函数类型 heapSort
1.调用createHeap()函数,建堆
2.for循环,倒着枚举,直到堆中只有一个元素,i从n开始,一直到1
1.调用swap函数,交换当前第i个元素和堆顶元素
2.调用downAdjust函数,形参为1,i-1表示从堆顶元素,当前元素的前面向下调整堆
*/
void heapSort()
{
createHeap();
for(int i=n; i>1; i--)
{
swap(heap[1],heap[i]);
downAdjust(1,i-1);
}
}