利用D叉堆排序实现:
#include<iostream>
using namespace std;
#define Fork 5
#define Parent(i) ((i-1)/Fork)
#define Sib1(i) (Fork*i+1)
#define Sib2(i) (Fork*i+2)
#define Sib3(i) (Fork*i+3)
#define Sib4(i) (Fork*i+4)
#define Sib5(i) (Fork*i+5)
void Max_Heapify(int a[],int length,int i)
{
int sib1,sib2,sib3,sib4,sib5;
sib1=Sib1(i);
sib2=Sib2(i);
sib3=Sib3(i);
sib4=Sib4(i);
sib5=Sib5(i);
int num=i;
if(sib1<length&&a[sib1]>a[i])
{
num=sib1;
}
if(sib2<length&&a[sib2]>a[num])
{
num=sib2;
}
if(sib3<length&&a[sib3]>a[num])
{
num=sib3;
}
if(sib4<length&&a[sib4]>a[num])
{
num=sib4;
}
if(sib5<length&&a[sib5]>a[num])
{
num=sib5;
}
if(num!=i)
{
int temp;
temp=a[i];
a[i]=a[num];
a[num]=temp;
Max_Heapify(a,length,num);
}
}
void Build_Max_Heap(int a[],int length )
{
int i;
for(i=(length-1)/Fork;i>=0;i--)
{
Max_Heapify(a,length,i);
}
}
void Heap_Sort(int a[],int length)
{
Build_Max_Heap(a,length);
int i;
int temp;
for(i=length-1;i>=1;i--)
{
temp=a[i];
a[i]=a[0];
a[0]=temp;
length-=1;
Max_Heapify(a,length,0);
}
}
int main()
{
int a[20]={2,5,3,15,4,19,4,8,9,7,11,10,12,14,1,9,20,17,15,16};
int b[10]={16,4,10,14,7,9,3,2,8,1};
Heap_Sort(b,10);
int i;
for(i=0;i<10;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
Heap_Sort(a,20);
for(i=0;i<20;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}