堆排序的过程就是不断建堆的过程:1)初始化得到初始堆;2)将堆顶元素和堆中最后元素交换,在构建堆。注意到这个交换过程除堆顶元素破坏堆,并不会影响堆(原因:堆顶元素或是最大,或是最小)。
因此堆排序有关键是两个建堆函数:自底向上堆化和自顶向下堆化,分别对应代码中FixUp()和FixDown()。需要注意的是:为了方便堆的操作,我们一般将N+1个元素的数组的第一个元素不用,使用1到N的元素建堆,原因是这样第i个元素的父节点严格对应i/2个元素,子节点严格对应2*i和2*i + 1元素(如果有的话)。当然你也可以改变这个约定,使用0到N-1作为建堆元素,这样的话就要注意元素和其父、子节点的关系(例如第i个元素的对应2*i + 1和2*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; } |
浙公网安备 33010602011771号