文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++实现堆排序实例介绍

2024-04-02 19:55

关注

概述:

堆排序是利用构建“堆”的方法确定具有最大值的数据元素,并把该元素与最后位置上的元素交换。可将任意一个由n个数据元素构成的序列按照(a1,a2,...,an),按照从左到右的顺序按层排列构成一棵与该序列对应的完全二叉树。

一棵完全二叉树是一个堆,当且仅当完全二叉树的每棵子树的根值ai≥其左子树的根值a2i,同时ai≥其右子树的根值a 2i+1 (1<i<n/2)。

实现堆排序需要实现两个问题:

如何由无序序列建成一个堆?如何在输出堆顶元素之后,调整剩余元素成为一个新的堆?

思路:

堆排序算法思想:

1、从最后一个非叶子节点逐步到树根,对每个子树进行调整堆。

2、重复n-1次如下处理:将堆的根与最后一个叶子交换,除最后一个叶子之外剩余部分再调整为堆。

调整堆算法思想:

1、将树根与其左右子树根值最大者交换;(大顶堆)

2、对交换后的左(或右)子树重复过程1,直到左(或右)子树为堆。

时间复杂度O(nlogn)

代码:

调整堆算法:


void HeapAdjust(int *array,int i,int length){	//调整堆 
	int leftChild=2*i+1;		//定义左右孩子 
	int rightChild=2*i+2;
	int max=i;		//初始化,假设左右孩子的双亲节点就是最大值 
	if(leftChild<length&&array[leftChild]>array[max]){
		max=leftChild;
	}
	if(rightChild<length&&array[rightChild]>array[max]){
		max=rightChild;
	}
	if(max!=i){		//若最大值不是双亲节点,则交换值 
		swap(array[max],array[i]);
		HeapAdjust(array,max,length);	//递归,使其子树也为堆 
	}
}

堆排序算法:


void HeapSort(int *array,int length){	//堆排序 
	for(int i=length/2-1;i>=0;i--){		//从最后一个非叶子节点开始向上遍历,建立堆 
		HeapAdjust(array,i,length);
	}
	for(int j=length-1;j>0;j--){		//调整堆 ,此处不需要j=0  
		swap(array[0],array[j]);
		HeapAdjust(array,0,j);		//因为每交换一次之后,就把最大值拿出(不再参与调整堆),第三个参数应该写j而不是length 
		Print(array,length); 
	}
}

完整代码:


//堆排序
#include <iostream> 
using namespace std;
void Print(int array[],int length){	//每执行一次打印一次序列 
	for(int i=0;i<length;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
}
void HeapAdjust(int *array,int i,int length){	//调整堆 
	int leftChild=2*i+1;		//定义左右孩子 
	int rightChild=2*i+2;
	int max=i;		//初始化,假设左右孩子的双亲节点就是最大值 
	if(leftChild<length&&array[leftChild]>array[max]){
		max=leftChild;
	}
	if(rightChild<length&&array[rightChild]>array[max]){
		max=rightChild;
	}
	if(max!=i){		//若最大值不是双亲节点,则交换值 
		swap(array[max],array[i]);
		HeapAdjust(array,max,length);	//递归,使其子树也为堆 
	}
}
void HeapSort(int *array,int length){	//堆排序 
	for(int i=length/2-1;i>=0;i--){		//从最后一个非叶子节点开始向上遍历,建立堆 
		HeapAdjust(array,i,length);
	}
	for(int j=length-1;j>0;j--){		//调整堆 ,此处不需要j=0  
		swap(array[0],array[j]);
		HeapAdjust(array,0,j);		//因为每交换一次之后,就把最大值拿出(不再参与调整堆),第三个参数应该写j而不是length 
		Print(array,length); 
	}
}
int main(){
	int array[]={49,38,65,97,76,13,27,49};
	int length=sizeof(array)/sizeof(*array);
	Print(array,length);			//先打印原始序列 
	HeapSort(array,length);
	return 0;
}

运行示例:

第一行是原始序列,第二到八行分别是经过7次调整堆所得到的序列。

到此这篇关于C++实现堆排序实例介绍的文章就介绍到这了,更多相关C++堆排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯