一聚教程网:一个值得你收藏的教程网站

热门教程

C++堆排序算法实例详解

时间:2022-06-25 04:35:29 编辑:袖梨 来源:一聚教程网

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

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

#include
intheapsize=0;//全局变量记录堆的大小
voidheapSort(intarray[],intn){
 voidbuildHeap(int[],int);
 voidexchange(int[],int,int);
 voidheapify(int[],int);
 buildHeap(array,n);
 for(inti=n-1;i>=1;i--){
  exchange(array,0,i);
  heapsize--;
  heapify(array,0);
 }
}
//构建堆
voidbuildHeap(intarray[],intn){
 voidheapify(int[],int);
 heapsize=n;
 //从最小的父节点开始,进行堆化,直到树根节点
 for(inti=heapsize/2-1;i>=0;i--){
  heapify(array,i);
 }
}
//堆化
voidheapify(intarray[],intn){
 voidexchange(int[],int,int);
 intleft_child=n*2+1;
 intright_child=n*2+2;
 intlargest;
 if(left_childarray[n]){
  largest = left_child;
 }
 else{
  largest = n;
 }
 if(right_childarray[largest]){
  largest=right_child;
 }
 if(largest!=n){
  exchange(array,largest,n);
  heapify(array,largest);
 }
}
voidexchange(intarray[],inti,intj){
 inttmp = array[i];
 array[i]=array[j];
 array[j]=tmp;
}
intmain(){
  intarr[9]={3,1,6,9,8,2,4,7,5};
  heapSort(arr,9);
  for(inti=0;i<9;++i){
    std::cout<
#include
#include
intmain()
{
  intarr[9]={0,1,2,3,4,8,9,3,5};
  std::vector vec(arr,arr+9);
  //0 1 2 3 4 8 9 3 5
  for(auto c:vec){
    std::cout<

希望本文所述对大家C++程序设计有所帮

热门栏目