堆排序

//头文件:
#ifndef HEAPSORT_H_INCLUDED
#define HEAPSORT_H_INCLUDED
#include <deque>
#include <limits>
using std::deque;

class Heap
{
public:
   Heap(deque<int> &vp)
   {
        v=&vp;
        v->push_front(99999);
       heap_size=vp.size()-1;
   }
  void  max_heapfix(size_t i);
  void  build_max_heap();
  void  heap_sort();
private:
deque<int> *v;
size_t heap_size;
};
int inline parent(size_t i)
{
    return i/2;
}
int inline left(size_t i)
{
 return (i<<1);
}
 int inline rigth(size_t i)
 {
     return ((i<<1)+1);
 }
#endif // HEAPSORT_H_INCLUDED

/*-------------------------------------------------------------------------------------------------------------------------
实现文件:
*/
#include <iostream>
#include "heapsort.h"
using namespace std;
void  Heap::max_heapfix(size_t i)
{
   //get the left and rigth childrens of i.
    size_t l=left(i);
    size_t r=rigth(i);
    size_t largest;//to store      max(v[i],v[l],v[r]).
        // get largest=max(l,i).
          if(l<=heap_size&&(*v)[l]>(*v)[i])
                  largest=l;
          else
                largest=i;
          //get largest=max(largest,r).
          if(r<=heap_size&&(*v)[r]>(*v)[largest])
               largest=r;
            /*if largest is not the position of i,then change the value
              and then rescive the funtion.*/
         if(largest!=i)
         {
             swap((*v)[i],(*v)[largest]);
             max_heapfix(largest);
         }
}
void Heap::build_max_heap()
{
    for(size_t i=(v->size())/2;i>=1;--i)
        max_heapfix(i);

}
void Heap::heap_sort()
{
   build_max_heap();
     for(size_t i=v->size()-1;i>=2;--i)
     {
            swap((*v)[i],(*v)[1]);
            heap_size--;
            max_heapfix(1);
     }
}
/*-----------------------------------------------------------------------------------------------------------------------------
测试文件:
*/
#include <iostream>
#include <deque>
#include <vector>
#include  "heapsort.h"
using namespace std;
int main()
{
    deque<int>  v;
      for(int i=120;i>=0;--i)
          v.push_back(i);
    Heap p(v);
    p.heap_sort();
   // copy(v.begin(),v.end(),iostream_iterator<int>(cout," "));
   for(size_t i=1;i!=v.size();++i)
      cout<<v[i]<<endl;
    return 0;
}
 
 
//参考文献《算法导论》

你可能感兴趣的:(堆排序)