根据《算法导论》第六章,写了heapsort的代码,如下:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
#define N 1000
void HeapSort(int *a, int &heapsizeA);
void BuildMaxHeap(int *a, int heapsizeC);
void MaxHeapify(int *a,int i, int &heapsizeB);
int main(int argc, char* argv[])
{
int n;
int a[N];
int heapsize;
ifstream fin("HeapSortData.123");//可以自定义各种奇怪的扩展名
ofstream fout("HeapSortData.out");
if(!fin)
{ cout<<"输入数据文件打开失败/n";
exit(1);
}
fin>>n;//回车换行或者空格都是fstream的分隔符
cout<<"The array is : /n";
//a[0]=1000;
for( int k=1 ; k<=n ; k++ )//为了和原书一致,数组从a[1]~a[n]存储数据,而弃掉a[0]。是否定义a[0]并不影响程序
{
fin>>a[k];
cout<<a[k]<<'/t';
}
fin.close();
heapsize=n;//n编译时不能确定,运行时才能确定。尽管heapsize的值是n,但是也是合理的。
HeapSort(a,heapsize);
if(!fout)
{ cout<<"输出数据文件创建失败/n";
exit(1);
}
for( int i=1 ; i<=n ; i++ )
{
cout<<a[i]<<'/t';
fout<<a[i]<<'/t';
}
return 0;
}
void HeapSort(int *a, int &heapsizeA)
{
BuildMaxHeap(a,heapsizeA);
for(int i=heapsizeA;i>=2;i--)
{
int temp=a[i];
a[i]=a[1];
a[1]=temp;
heapsizeA--;
MaxHeapify(a,1,heapsizeA);
}
}
void BuildMaxHeap(int *a, int heapsizeC){
for(int i=floor(heapsizeC/2);i>=1;i--)
MaxHeapify(a,i,heapsizeC);
}
void MaxHeapify(int *a,int i, int &heapsizeB){//引用型变量的使用
int l=2*i;
int r=2*i+1;
int largest;
if((l<=heapsizeB)&&(a[i]<a[l]))
largest=l;
else
largest=i;
if((r<=heapsizeB)&&(a[largest]<a[r]))
largest=r;
if(largest!=i)
{
int temp=a[largest];
a[largest]=a[i];
a[i]=temp;
MaxHeapify(a,largest,heapsizeB);
}
}