C++数据结构--堆排序

本文介绍了如何使用C++实现堆排序,详细讲解了makeHeap()和popHeap()函数,并给出了堆化的向量数组示例及堆排序的完整代码。通过示例代码展示了如何对一组数字进行堆排序并输出排序后的结果。
摘要由CSDN通过智能技术生成

           popHeap()  ,adjustHeap()详见 C++数据结构--用向量数组实现大(小)根堆的插入和删除



1.对已经堆化的数组进行堆排序
 




2.向量堆化
  堆化前的向量数组v{9,12,17,30,50,20,60,65,4,19}
 


  堆化过程示意图
 
 



 




 实现代码:
#include <iostream>
#include<vector>
#include<functional>
using namespace std;


/********以下省略****/
popHeap()  
adjustHeap()
/********************/





template<typename T,typename compare>
//构建堆 
void makeHeap(vector<T> &v,compare cp=compare())
{


int lastPos=v.size(); 
int prtPos=(lastPos-2)/2;
//最后一个节点索引为lastPos-1,所以其父结点所以(lastPos-2)/2
while(prtPos>=0) //循环直到根结点索引 
{
adjustHeap(v,prtPos,lastPos,cp); //调整堆v[prtPos,lastPos-1] 
prtPos--; 
}
}
 
 
template<typename T,typename compare>
/*堆排序 : 
 *v为任意向量数组堆 
 */

void heapSort(vector<T> &v,compare cp=compare())
{
makeHeap(v,cp);
 //构建堆 
for(int i=v.size();i>1;i--)  //从后往前进行堆排序
 popHeap(v,i,cp);





int main(int argc, char** argv)
 {
  
   vector<int> vec{9,12,17,30,50,20,60,65,4,19};
   heapSort(vec,less_equal<int>());
   for(int x:vec)
   {
    cout<<x<<ends;
   }
 
  return 0;
}



output:
    65 60 50 30 20 19 17 12 9 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值