堆排序(大根堆)
2006-10-13 13:04
288 查看
#include "stdio.h"
bool MaxOrEqual(int a0,int a1)
{
if(a0 < a1) return false;
return true;
};
bool MaxOnly(int a0,int a1)
{
if(a0 > a1) return true;
return false;
};
void ChangeEach(int &A,int &B)
{
int tt = A;
A = B;
B = tt;
};
int HeapifyBig(int T[],int N,int Cur)
{
int child = Cur*2;
if(child+1 <= N)//2 child
{
if( MaxOrEqual(T[child], T[child+1]) )
{//first child bigger
if( MaxOrEqual(T[child], T[Cur]) )
{
ChangeEach(T[child], T[Cur]);
//return child;
HeapifyBig( T , N,child);
}
}else
{//second child bigger
if( MaxOrEqual(T[child+1], T[Cur]) )
{
ChangeEach(T[child+1], T[Cur]);
//return child+1;
HeapifyBig( T , N,child+1);
}
}
}
else if(child <= N)// 1 child
{
if( MaxOrEqual(T[child], T[Cur]) )
{
ChangeEach(T[child], T[Cur]);
//return child;
HeapifyBig( T , N,child);
}
}
return -1;
};
//数组从一开始
void BuildHeap(int T[],int N)
{
int i = N/2;//最后一个内点
for(;i>0;i--)
{
HeapifyBig(T,N,i);
}
};
void HeapSortBig(int T[],int N)
{
BuildHeap(T, N);
int i;
for(i=N;i>0;)
{
ChangeEach(T[1],T[i]);
i--;
HeapifyBig(T,i,1);
}
};
int main()
{
int AA[256] ={-1,22,44,11,88,5,23,89,56,94,87};
int NN = 9;
int i;
//test--------
HeapSortBig( AA , NN);
for(i=1;i<=NN;i++)
printf("%d,",AA[i]);
printf("/n");
//test============
return 0;
}
bool MaxOrEqual(int a0,int a1)
{
if(a0 < a1) return false;
return true;
};
bool MaxOnly(int a0,int a1)
{
if(a0 > a1) return true;
return false;
};
void ChangeEach(int &A,int &B)
{
int tt = A;
A = B;
B = tt;
};
int HeapifyBig(int T[],int N,int Cur)
{
int child = Cur*2;
if(child+1 <= N)//2 child
{
if( MaxOrEqual(T[child], T[child+1]) )
{//first child bigger
if( MaxOrEqual(T[child], T[Cur]) )
{
ChangeEach(T[child], T[Cur]);
//return child;
HeapifyBig( T , N,child);
}
}else
{//second child bigger
if( MaxOrEqual(T[child+1], T[Cur]) )
{
ChangeEach(T[child+1], T[Cur]);
//return child+1;
HeapifyBig( T , N,child+1);
}
}
}
else if(child <= N)// 1 child
{
if( MaxOrEqual(T[child], T[Cur]) )
{
ChangeEach(T[child], T[Cur]);
//return child;
HeapifyBig( T , N,child);
}
}
return -1;
};
//数组从一开始
void BuildHeap(int T[],int N)
{
int i = N/2;//最后一个内点
for(;i>0;i--)
{
HeapifyBig(T,N,i);
}
};
void HeapSortBig(int T[],int N)
{
BuildHeap(T, N);
int i;
for(i=N;i>0;)
{
ChangeEach(T[1],T[i]);
i--;
HeapifyBig(T,i,1);
}
};
int main()
{
int AA[256] ={-1,22,44,11,88,5,23,89,56,94,87};
int NN = 9;
int i;
//test--------
HeapSortBig( AA , NN);
for(i=1;i<=NN;i++)
printf("%d,",AA[i]);
printf("/n");
//test============
return 0;
}