加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网_保定站长网 (https://www.52baoding.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 经验 > 正文

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

发布时间:2020-12-24 08:56:05 所属栏目:经验 来源:网络整理
导读:本篇章节讲解C++堆排序算法。供大家参考研究具体如下: 堆中元素的排列方式分为两种:max-heap或min-heap,前者每个节点的key都大于等于孩子节点的key,后者每个节点的key都小于等于孩子节点的key。 由于堆可以看成一个完全二叉树,可以使用连续空

本篇章节讲解C++堆排序算法。分享给大家供大家参考,具体如下:

堆中元素的排列方式分为两种: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,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 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,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++程序设计有所帮助。

(编辑:天瑞地安资讯网_保定站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读