算法设计之堆的实现与堆排序实现(C++实现)

来源:互联网 发布:域名排名选择 编辑:程序博客网 时间:2024/06/05 05:58
// heap.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "iostream"using namespace std;//用于维护最大堆的性质,假定 以 leftChild(i)和rightChild(i)为根节点的二叉树都是最大堆,//但是 arr[i] 可能小于其孩子,这就违背了最大堆的性质。void maxHeapity(int*,int);void buildMaxHeap(int*,int);//构建一个最大堆void heapSort(int*,int);//利用最大堆进行堆排序int parent(int);//根据给定节点的下标 i ,计算它的父节点的下标。int leftChild(int);//根据给定节点的下标 i ,计算它的左孩子节点的下标。int rightChild(int);//根据给定节点的下标 i ,计算它的右孩子节点的下标。////////////////////////////////////////////////////////////////////////////////////////////主函数int _tmain(int argc, _TCHAR* argv[]){int arr[]={4,1,3,2,16,9,10,14,8,7};int arrSize =10;//存放数组中元素的个数cout<<"原来数组的情况:";for(int i=0;i<arrSize;i++)cout<<arr[i]<<", ";cout<<endl;//构建堆buildMaxHeap(arr,arrSize);//输出构建后的堆cout<<"构建成堆后的数组值:";for(int i=0;i<arrSize;i++)cout<<arr[i]<<", ";cout<<endl;//堆排序heapSort(arr,arrSize);cout<<"堆排序后的结果";//输出堆排序后的结果for(int i=0;i<arrSize;i++)cout<<arr[i]<<", ";cout<<endl;return 0;}void maxHeapity(int* arr,int i,int arrSize){int l = leftChild(i);int r = rightChild(i);int maxIndex=0;if(l<=arrSize-1 && arr[l]>=arr[i])maxIndex =l;else maxIndex = i;if(r<=arrSize-1&&arr[r]>=arr[maxIndex])maxIndex = r;if(maxIndex !=i){int temp;temp = arr[maxIndex];arr[maxIndex] = arr[i];arr[i] = temp;maxHeapity(arr,maxIndex,arrSize);}}void buildMaxHeap(int* p,int arrSize){for(int i=arrSize-1/2;i>=0;i--)maxHeapity(p,i,arrSize);}int parent(int i){return i/2;}int leftChild(int i){return 2*i+1;}int rightChild(int i){return 2*(i+1);}void heapSort(int* arr,int arrSize){buildMaxHeap(arr,arrSize);for(int i=arrSize-1;i>=0;i--){int temp;temp=arr[0];arr[0]=arr[i];arr[i]=temp;arrSize -=1;maxHeapity(arr,0,arrSize);}


}
0 0
原创粉丝点击