原理見算法導論第三版第六章:
以下是c++版本:
<span style="font-size:18px;">#include <iostream>
#include <vector>
using namespace std;
#define uint unsigned int
void MaxHeapify(vector<int> &Array,int i);
void main()
{
int num;
vector<int> Array;
vector<int> AfterSort;
while(cin>>num)
Array.push_back(num);
cout<<"Before sort:"<<endl;
for(vector<int>::iterator first=Array.begin(),last=Array.end();first!=last;first++)
cout<<*first<<","<<flush;
cout<<endl;
cout<<"After sort:"<<endl;
for(int i=Array.size()/2-1;i>=0;--i)
MaxHeapify(Array,i);
for (int i=Array.size()-1;i>=0;--i) //剛開始將i定義爲uint類型,結果死循環
{
int tmp;
tmp=Array[0];
if (Array.size()==2 && Array[0]>Array[1]) //此處做了些修改,照着書上寫過來有問題,最後做了些調整
{
Array[0]=Array[1];
}
else
{
Array[0]=Array[i];
Array[i]=tmp;
}
AfterSort.push_back(tmp);
Array.pop_back();
MaxHeapify(Array,0);
}
vector<int>::iterator first=AfterSort.begin(),last=AfterSort.end();
while (first!=last)
{
cout<<*first<<","<<flush;
first++;
}
cout<<endl;
}
void MaxHeapify(vector<int> &Array,int i)
{
uint child=(uint)(2*i+1);
if(child<Array.size())
{
uint r_child=child+1;
if(r_child<Array.size() )
if (Array[child]<Array[r_child])
child=r_child;
if (Array[i]<Array[child])
{
int tmp=Array[i];
Array[i]=Array[child];
Array[child]=tmp;
MaxHeapify(Array,child);
}
}
}</span>
C版本:
<span style="font-size:18px;">#include <stdio.h>
#define MaxSize 100
void HeapSort_C(int *Array,int n);
void Sift(int *Array,int low,int max) ;
void main()
{
int n=4,num;
int Array[]={0,1,8,9,2};
printf("Input data:");
for(int i=1;i<=n;i++)
printf("%d,",Array[i]);
printf("\nAfter sort:");
HeapSort_C(Array,n);
for(int i=1;i<=n;i++)
printf("%d,",Array[i]);
printf("\n");
}
void HeapSort_C(int *Array,int n)
{
int i,tmp;
for(i=n/2;i>=1;i--) //輸入數據第一位必須是一個無效位
Sift(Array,i,n);
for (i=n;i>1;i--)
{
tmp=Array[1];
Array[1]=Array[i];
Array[i]=tmp;
Sift(Array,1,i-1);
}
}
void Sift(int *Array,int low,int max) //建堆
{
int i=low,j=2*i;
int tmp=Array[i];
while (j<=max)
{
if(j<max && Array[j]<Array[j+1])
j++;
if (tmp<Array[j]) //以i爲根的子樹
{
Array[i]=Array[j];
i=j;
j=2*i;
}
else
break;
}
Array[i]=tmp;
}</span>