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

 更新时间:2017年08月15日 11:14:00   作者:叶赫那拉坤  
这篇文章主要介绍了C++堆排序算法,简单分析了堆排序算法的原理并结合实例形式分析了C++实现堆排序的具体操作技巧,需要的朋友可以参考下

本文实例讲述了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,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++程序设计有所帮助。

相关文章

  • 浅谈 C++17 里的 Visitor 模式

    浅谈 C++17 里的 Visitor 模式

    Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,本文主要介绍 C++17 里的 Visitor 模式的相关资料,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • C++之异常处理详解

    C++之异常处理详解

    C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理
    2013-08-08
  • 浅析c++函数参数和返回值

    浅析c++函数参数和返回值

    c++一直以来是一个关注效率的代码,这样关于函数的参数传递和返回值的接收,是重中之重,这篇文章主要介绍了c++函数参数和返回值,需要的朋友可以参考下
    2023-05-05
  • C语言实现按行读写文件

    C语言实现按行读写文件

    这篇文章主要为大家详细介绍了C语言实现按行读写文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 如何用C++实现双向循环链表

    如何用C++实现双向循环链表

    本篇文章是对用C++实现双向循环链表的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 超详细解析C++实现归并排序算法

    超详细解析C++实现归并排序算法

    归并排序是比较稳定的排序方法。它的基本思想是把待排序的元素分解成两个规模大致相等的子序列。本文将用C++实现这一排序算法,需要的可以参考一下
    2022-09-09
  • C++ 成员变量的初始化顺序问题详解

    C++ 成员变量的初始化顺序问题详解

    这篇文章主要介绍了C++ 成员变量的初始化顺序问题详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • cmake跨平台构建工具的学习笔记

    cmake跨平台构建工具的学习笔记

    CMake是一个跨平台的安装/编译工具,通过CMake我们可以通过简单的语句来描述所有平台的安装/编译过程,下面这篇文章主要给大家介绍了关于cmake跨平台构建工具的相关资料,需要的朋友可以参考下
    2023-02-02
  • Qt服务应用操作之JSON文件操作方法

    Qt服务应用操作之JSON文件操作方法

    在Qt框架中,处理JSON数据包括解析、生成、保存和读取文件等操作,本文详细介绍了这些操作的关键类和方法,如QJsonDocument、QJsonObject、QJsonArray等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • C++ Boost Assign超详细讲解

    C++ Boost Assign超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12

最新评论