算法:C++中的堆排序

9 篇文章 0 订阅
7 篇文章 0 订阅

堆中元素的排列方式分为两种: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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值