在网上看的代码基本上都是这样的:
#include<iostream>
using namespace std;
void MakeHeap (int a[], int n);
int
main ()
{
int a[100];
int n, i;
cout << "Enter the number:" << endl;
cin >> n;
for (i = 1; i <= n; i++)
{
cout << "Enter the element of the Heap:" << endl;
cin >> a[i];
}
MakeHeap (a, n);
cout << "The Heap is:" << endl;
for (i = 1; i <= n; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 1;
}
void
MakeHeap (int a[], int n)
{
int i, j, flag;
for (i = n / 2; i >= 1; i--)
{
j = 2 * i;
if (a[j] <= a[j + 1])
j++;
if (a[i] < a[j])
{
flag = a[i];
a[i] = a[j];
a[j] = flag;
}
}
}
但是我总感觉不太对,所以就拿这个运行了一下,结果真的是错的,他这里只是实现了一步而已。也许是我没搞明白他的意思吧。
所以我自己实现了一个简单的,没考虑算法复杂度(特别是堆的建立,堆的排序还是挺简单的)。
#include<iostream>
using namespace std;
int data[100];
int count;
void printList(int data[],int length)
{
int i;
for(i=0;i<length;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}
void swap(int& first,int& second )
{
int temp=first;
first=second;
second=temp;
}
void HeapSort(int* data,int position)
{
if(position<=0)
return;
if(data[position]>data[(position-1)/2])
{
swap(data[position],data[(position-1)/2]);
HeapSort(data,(position-1)/2);
}
}
void insert(int* data,int value)
{
data[count++]=value;
HeapSort(data,count-1);
}
void BuildBigHeap(int* data,int size)
{
bool isChange=true;
while(isChange)
{
isChange=false;
int i;
for(i=(size-2)/2;i>=0;i--)
{
int j=2*i+1;
if(data[j]<data[j+1])
j++;
if(data[i]<data[j])
{
swap(data[i],data[j]);
isChange=true;
}
}
}
}
void main()
{
cout<<"请输入count的值:";
cin>>count;
cout<<endl;
int i;
for(i=0;i<count;i++)
{
cout<<"请输入第"<<i<<"个值: ";
cin>>data[i];
cout<<endl;
}
printList(data,count);
BuildBigHeap(data,count);
printList(data,count);
insert(data,7);
printList(data,count);
return;
}