堆排序是利用构建“堆”的方法确定具有最大值的数据元素,并把该元素与最后位置上的元素交换。可将任意一个由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]&鞍山科大lt;<" ";}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(ar三国杀袁绍台词ray,length);//先打印原始序列 heapsort(array,length);return 0;}
运行示例:
第一行是原始序列,第二到八行分别是经过7次调整堆所得到的序列。
到此这篇关于c++实现堆排序实例介绍的文章就介绍到这了,更多相关c++堆排序内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 04:36:51,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/cbbd8e83bdd2c427fbf7b40b04849630.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++实现堆排序实例介绍.doc
本文 PDF 下载地址:C++实现堆排序实例介绍.pdf
留言与评论(共有 0 条评论) |