堆排序的过程就是不断建堆的过程:1)初始化得到初始堆;2)将堆顶元素和堆中最后元素交换,在构建堆。注意到这个交换过程除堆顶元素破坏堆,并不会影响堆(原因:堆顶元素或是最大,或是最小)。

因此堆排序有关键是两个建堆函数:自底向上堆化和自顶向下堆化,分别对应代码中FixUp()和FixDown()。需要注意的是:为了方便堆的操作,我们一般将N+1个元素的数组的第一个元素不用,使用1N的元素建堆,原因是这样第i个元素的父节点严格对应i/2个元素,子节点严格对应2*i2*i + 1元素(如果有的话)。当然你也可以改变这个约定,使用0N-1作为建堆元素,这样的话就要注意元素和其父、子节点的关系(例如第i个元素的对应2*i + 12*i + 2元素(如果有的话)等)。

给出实现源码为:

//HeapSort.h

 

#ifndef _HEAP_SORT_H_

#define _HEAP_SORT_H_

 

#include <cstdlib>

 

#include <conio.h>

#include <time.h>

 

#include <iostream>

using namespace std;

 

    template <class Item>

void FixUp(Item* data,int idx)

{

           while (idx > 1)

           {

                  if (data[idx] < data[idx / 2])

                         ExchData(data[1],data[idx]);

 

                  idx = idx / 2;

           }

}

 

template <class Item>

void FixDown(Item* data,int len,int idx)

{

       while (idx*2 < len)

       {

              int lchild = idx*2;

 

              if ((lchild + 1) == len)

              {

              }

              else

              {

                     if (data[lchild] < data[lchild + 1])

                            lchild ++;

              }

 

              if (data[idx] < data[lchild])

              {

                     ExchData(data[idx],data[lchild]);

              }

 

              idx = lchild;

       }

}

 

template <class Item>

void ExchData(Item& item1,Item& item2)

{

       Item tmp = item1;

       item1 = item2;

       item2 = tmp;

}

 

template <class Item>

void HeapSort(Item* data,int len)

{

       //construct the original heap

       for (int i = len / 2; i >= 1; i--)

              FixDown(data,len,i);

 

       //begin to heap sort

       while (len > 1)

       {

              ExchData(data[1],data[len - 1]);

 

              FixDown(data,--len,1);

       }

      

}

 

//data generator,the max Num is MAX_BOUND,1000 default.

template <class Item>

Item* InitData(int len,int MAX_BOUND = 1000)

{

       Item* data = new Item[len];

      

       srand((unsigned)time(NULL));

      

       for (int i = 0; i < len; i++)

       {

              data[i] = rand() % MAX_BOUND;

       }

      

       return data;

}

 

//print the data

template <class Item>

void Print(Item* data,int len,char* info)

{

       cout<<info<<endl;

      

       for (int i = 1; i < len;i++)

              cout<<data[i]<<" ";

 

       cout<<endl;

}

 

#endif //~_HEAP_SORT_H_

 

测试程序为:

//main.cpp

 

#include "HeapSort.h"

 

#include <iostream>

using namespace std;

 

const int DATA_LENGTH = 16;

 

int main(int argc,char* argv[])

{

       int* _data = InitData<int>(DATA_LENGTH);

      

       Print(_data,DATA_LENGTH,"before heap sort.....");

      

       HeapSort(_data,DATA_LENGTH);

      

       Print(_data,DATA_LENGTH,"after heap sort......");

      

       return 0;

}

Posted on 2005-07-17 10:57  k_eckel's mindview  阅读(913)  评论(0)    收藏  举报