堆排序的c++实现代码

#include <cstdlib>
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
void input(vector<int> &v)
{
     v.push_back(0);
     int data;
     while(cin>>data)
     {
      v.push_back(data);
     }
}
void output(vector<int> &v)
{
     for(vector<int>::iterator c_iter=v.begin();c_iter!=v.end();++c_iter)
     cout<<*c_iter<<" ";
     cout<<endl;
}
void max_heap(vector<int> &v,int heap_len,int i)
{
     int larg=i;
     if(2*i<=heap_len&&v[2*i]>v[larg])
     larg=2*i;
     if(2*i+1<=heap_len&&v[2*i+1]>v[larg])
     larg=2*i+1;
     if(larg!=i)
     {
      int temp=v[i];
      v[i]=v[larg];
      v[larg]=temp;
      max_heap(v,heap_len,larg);
     }
}
void build_heap(vector<int> &v,int heap_len)
{
     for(int i=heap_len/2;i>=1;--i)
     max_heap(v,heap_len,i);
}
void sort_heap(vector<int> &v)
{
     static int heap_len=v.size()-1;
     if(heap_len!=1)
     {
     build_heap(v,heap_len);
     int temp=v[1];
     v[1]=v[heap_len];
     v[heap_len]=temp;
     --heap_len;
     sort_heap(v);
     }
}
int main(int argc, char *argv[])
{
    vector<int> v;
    input(v);
    build_heap(v,v.size()-1);
    sort_heap(v);
    output(v);
    system("PAUSE");
    return EXIT_SUCCESS;

}

时间复杂度为O(nlgn)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值