堆的操作和堆排序

1 向下调整

总是将当前结点V与它的左右孩子比较(如果有的话),假如孩子中存在权值比结点V的权值大的,就将其中权值最大的那个孩子结点与结点V交换;交换完毕后继续让结点V和孩子比较,直到结点V的孩子的权值都比结点V的权值小或是结点V不存在孩子结点

//对heap数组在[low,high]范围进行向下调整 
void downAdjust(int low,int high){
	int i=low,j=i*2;	//i为欲调整结点,j为其左孩子
	while(j<=high){	//存在孩子结点
		//如果右孩子存在,且右孩子的值大于左孩子 
		if(j+1<=high&&heap[j+1]>heap[j])
			j=j+1;	//j存储右孩子下标 
		//如果孩子中最大的权值比欲调整结点i大
		if(heap[j]>heap[i]){
			swap(heap[j],heap[i]);	//交换最大权值的孩子与欲调整结点i 
			i=j;	//保持i为欲调整结点,j为i的左孩子 
			j=i*2;
		}else
			break;	//孩子的权值均比欲调整结点i小,调整结束 
	} 
}

2 建堆

//建堆
void createHeap(){
	for(int i=n/2;i>=1;i--)
		downAdjust(i,n);
} 

3 删除堆顶元素

//删除堆顶元素
void deleteTop(){
	heap[1]=heap[n--];	//用最后一个元素覆盖堆顶元素,并让元素个数减1 
	downAdjust(1,n);	//向下调整堆顶元素 
} 

4 向上调整

总是把欲调整结点与父亲结点比较,如果权值比父亲结点大,那么就交换其与父亲结点,这样反复比较,直到到达堆顶或是父亲结点的权值较大为止。

//对heap数组在[low,high]范围进行向上调整
void upAdjust(int low,int high){
	int i=high,j=i/2;	//i为欲调整结点,j为父亲
	while(j>=low){
		if(heap[j]<heap[i]){
			swap(heap[j],heap[i]);
			i=j;
			i=i/2;
		}else
			break;
	} 
} 

5 添加元素

//添加元素x 
void insert(int x){
	heap[++n]=x;	//让元素个数加1,然后将数组末位赋值为x 
	upAdjust(1,n);	//向上调整新加入的结点n 
}

6 堆排序

//堆排序
void heapSort(){
	//createHeap();	//建堆 
	for(int i=n;i>=1;i--){
		swap(heap[i],heap[0]);
		downAdjust(0,i-1);
	}
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值