堆排序(依据算法导论伪代码)

来源:互联网 发布:淘宝双查号 编辑:程序博客网 时间:2024/06/11 06:10
// MAX_HEAP.cpp : 定义控制台应用程序的入口点。////堆排序(依据算法导论伪代码)
//数组有效是从1开始的
//程序仅供记录自己的学习历程#include "stdafx.h"#include "iostream"using namespace std;//此类实现了最大堆的创建//排序class HeapSort{public://创建一个堆void Build_Heap(int *A,int len);//构建最大堆void Max_Heap(int *A,int i,int len);//输出void OutToScreen(int *A,int len);//堆排序void Heap_Sort(int *A,int len);//交换数据void SwapData(int *A, int n1,int n2);};void HeapSort::Build_Heap(int *A,int len){for(int i = len/2;i >= 1; i--)this->Max_Heap(A,i,len);}void HeapSort::Max_Heap(int *A,int i,int len){int left;int right;left = i<<1;//注:数组从1开始才有效right = (i<<1) + 1;int largest;if((left <=len)&&(A[left]>A[i]))largest = left;elselargest = i;if((right <=len)&&(A[right]>A[largest]))largest = right;if(i != largest){SwapData(A,i,largest);Max_Heap(A,largest,len);}}void HeapSort::OutToScreen(int *A,int len){for(int i = 0; i < len;i++)cout<<A[i]<<"  ";cout<<endl;}void HeapSort::Heap_Sort(int *A,int len){Build_Heap(A,len);//先创建一个堆for(int i = len; i >=2; i--)//此处需要注意2{SwapData(A,i,1);Max_Heap(A,1,i-1);}}void HeapSort::SwapData(int *A, int n1,int n2){int temp = A[n1];A[n1] = A[n2];A[n2] = temp;}int AA[]= {0,27,17,3,16,13,10,1,5,7,12,4,8,9,0};int _tmain(int argc, _TCHAR* argv[]){HeapSort hs;hs.Heap_Sort(AA,sizeof(AA)/sizeof(int)-1);hs.OutToScreen(&AA[0],sizeof(AA)/sizeof(int));return 0;}