C++中堆排序算法有什么用-创新互联

这篇文章主要为大家展示了“C++中堆排序算法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中堆排序算法有什么用”这篇文章吧。

10年积累的网站设计、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先制作网站后付款的网站建设流程,更有山西免费网站建设让你可以放心的选择与我们合作。

具体如下:

堆中元素的排列方式分为两种:max-heap或min-heap,前者每个节点的key都大于等于孩子节点的key,后者每个节点的key都小于等于孩子节点的key。

由于堆可以看成一个完全二叉树,可以使用连续空间的array来模拟完全二叉树,简单原始的实现如下:

#include<iostream>
int heapsize=0;//全局变量记录堆的大小
void heapSort(int array[],int n){
 void buildHeap(int [],int);
 void exchange(int[],int,int);
 void heapify(int[],int);
 buildHeap(array,n);
 for(int i=n-1;i>=1;i--){
  exchange(array,0,i);
  heapsize--;
  heapify(array,0);
 }
}
//构建堆
void buildHeap(int array[],int n){
 void heapify(int[],int);
 heapsize=n;
 //从最小的父节点开始,进行堆化,直到树根节点
 for(int i=heapsize/2-1;i>=0;i--){
  heapify(array,i);
 }
}
//堆化
void heapify(int array[],int n){
 void exchange(int[],int,int);
 int left_child=n*2+1;
 int right_child=n*2+2;
 int largest;
 if(left_child<heapsize&&array[left_child]>array[n]){
  largest = left_child;
 }
 else{
  largest = n;
 }
 if(right_child<heapsize&&array[right_child]>array[largest]){
  largest=right_child;
 }
 if(largest!=n){
  exchange(array,largest,n);
  heapify(array,largest);
 }
}
void exchange(int array[],int i,int j){
 int tmp = array[i];
 array[i]=array[j];
 array[j]=tmp;
}
int main(){
  int arr[9]={3,1,6,9,8,2,4,7,5};
  heapSort(arr,9);
  for(int i=0;i<9;++i){
    std::cout<<arr[i]<<" ";
  }
  std::cout<<std::endl;
  return 0;
}
STL中实现了max-heap的操作。在使用heap算法是需添加头文件algorithm。
#include <iostream>
#include<vector>
#include<algorithm>
int main()
{
  int arr[9]={0,1,2,3,4,8,9,3,5};
  std::vector<int> vec(arr,arr+9);
  //0 1 2 3 4 8 9 3 5
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  make_heap(vec.begin(),vec.end());
  //9 5 8 3 4 0 2 3 1
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  vec.push_back(7);
  push_heap(vec.begin(),vec.end());
  //9 7 8 3 5 0 2 3 1 4
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  pop_heap(vec.begin(),vec.end());
  //8 7 4 3 5 0 2 3 1 9,只是将大值挪到了vector的最后,并没有删除
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  std::cout<<vec.back()<<std::endl;//9
  //将9删除
  vec.pop_back();
  //连续的pop_heap操作,每次的大值都放在最尾端,最后呈现递增排序
  sort_heap(vec.begin(),vec.end());
  //0 1 2 3 3 4 5 7 8
  for(auto c:vec){
    std::cout<<c<<" ";
  }
  std::cout<<std::endl;
  return 0;
}

以上是“C++中堆排序算法有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联网站建设公司行业资讯频道!

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

标题名称:C++中堆排序算法有什么用-创新互联
文章起源:https://www.cdcxhl.com/article18/espdp.html

成都网站建设公司_创新互联,为您提供营销型网站建设微信公众号网站排名ChatGPTApp开发商城网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发