堆排序

来源:互联网 发布:mac软件开发工具 编辑:程序博客网 时间:2024/06/08 09:11

堆排序的步骤为:初始建堆(BuildHeap)和堆排序(HeapSort)。其中BuildHeap调用HeapAdjust调整堆(大根堆或者小根堆)

下面为应用大根堆排序的C++算法:


类的声明

#pragma onceclass CCollections{public:CCollections(void);~CCollections(void);public:static void buildHeap(int* A,int size);static void heapAdjust(int* A, int i, int size);static void heapSort(int* A, int size);public:static void show(int* A,int size);};
类方法定义
void CCollections::show(int* A, int size){for(int i=1;i<=size;i++){cout<<A[i]<<",";}cout<<endl;}//初始建堆void CCollections::buildHeap(int* A, int size){for(int i=size/2;i>0;i--){heapAdjust(A,i,size);}}//调整堆void CCollections::heapAdjust(int* A, int i, int size){int leftChild = i*2; //左孩子int rightChild = i*2 + 1; //右孩子int maxIndex = i;if(i <= size/2){if(leftChild < size && A[leftChild] > A[maxIndex]){maxIndex = leftChild;}if(rightChild < size && A[rightChild] > A[maxIndex]){maxIndex = rightChild;}if(i != maxIndex){swap(A[i],A[maxIndex]);heapAdjust(A,maxIndex,size); //应用递归对有可能破坏的孩子节点重新建堆}}}void CCollections::heapSort(int* A, int size){buildHeap(A,size); //初始建堆for(int i=size;i>=1;i--){swap(A[1],A[i]); //把堆顶元素和最后一个置换heapAdjust(A,1,i); //去掉堆顶后,重新调整堆,堆size-1}}
主函数
int _tmain(int argc, _TCHAR* argv[]){//待排序数组,其中第一个元素-1为废弃元素。从8开始到1为实际待排序元素//只有从序号1开始,做孩子才是i*2,右孩子才是i*2+1int A[9] = {-1,8,4,7,6,3,5,9,1};CCollections::show(A,8);CCollections::heapSort(A,8);CCollections::show(A,8);return 0;}