堆排序的操作時這樣的:
//Heapfy
有三個指針(不是C裏的物理指針)指向堆中的父結點和左右結點,分別是idx(父),left,right 。
還有一個largest指向 這三者中最大的那個。
如果,idx不等於largest,則交換 array[idx]和array[largets]的值,然後從largest開始向後遞歸。
注意:這只是完成一次,父>左右結點的操作,並不是整個排序完成,說到底,這個操作只是把小的數放到下面的葉子去了。
//buildHeap
排序的時候,從一半的位置向前調用Heapfy,因爲一半的後面都是前面的子結點
以下程序部分借鑑 http://blog.csdn.net/moxiaomomo/article/details/6331386
#include <iostream>
using namespace std;
void Heapfy(int A[],int idx,int max) //建立最大堆
{
int left=idx*2+1;
int right=left+1;
int largest;
if(left<max&&A[left]>A[idx])
largest=left;
else
largest=idx;
if(right<max&&A[largest]<A[right])
largest=right;
if(largest!=idx)
{
int temp=A[largest]; //較大的節點值將交換到其所在節點的父節點
A[largest]=A[idx];
A[idx]=temp;
Heapfy(A,largest,max); //遞歸遍歷
}
}
void buildHeap(int A[],int ll)
{
int len=ll;
for(int i=len/2-1;i>=0;--i) //從一半的位置開始向前,因爲一半後面的都是前面的子節點
{
Heapfy(A,i,len); //建立最大堆,將堆中最大的值交換到根節點
}
for(int i=len-1;i>=1;--i)
{
int temp=A[0]; //將當前堆的根節點交換到堆尾的指定位置
A[0]=A[i];
A[i]=temp;
Heapfy(A,0,i); //建立下一次的最大堆
}
}
void show_array(int *a,int len)
{
cout<<endl;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
int array[6]={18,10,9,22,1,3};
show_array(array,6);
buildHeap(array,6);
show_array(array,6);
return 0;
}