根据《算法导论》第六章,写了heapsort的代码,如下: // HeapSort.cpp : Defines the entry point for the console application. // #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); } }