/*
*将两个元素进行交换
*params *p ,*q待交换的两个元素的指针
*/
void swap(int *p,int *q)
{
int temp ;
temp = *p ;
*p = *q ;
*q = temp ;
}
/*
*堆向下调整
*list:堆的数组,hole:待调整的数据,len:待调整的堆的大小
*/
void HeapAdjust(int *list,int hole,int len)
{
int lChild = 2*hole ;//左孩子
int rChild = 2*hole+1 ;//右孩子
int Max = hole ;//记录
if(hole <=len/2)//如果是叶子节点则不需要调整
{
if(lChild<=len && list[Max] < list[lChild])//list[Max]小于左孩子
Max = lChild ; //调整Max为lChild
if(rChild<=len && list[Max] < list[rChild])//list[Max]小于右孩子
Max = rChild ; //调整Max为rChild
if(Max!=hole) //如果孩子节点大于待调整的节点
{
swap(&list[Max],&list[hole]) ; //交换孩子节点与待调整节点的值
HeapAdjust(list,Max,len) ; //将孩子节点的值继续向下调整
}
}
}
/*
*建立堆
*params list:待建立堆的数组,len:list的长度
*/
void buildHeap(int*list,int len)
{
int i ;
for(i = len/2;i>=1;i--) //将从最后一个非叶子节点进行向下调整
{
HeapAdjust(list,i,len) ;//堆的第i个节点向下调整
}
}
/*
*堆的排序
*params list:堆,len:堆的大小
*/
void HeapSort(int*list,int len)
{
int i ;
buildHeap(list,len) ;//建立大顶堆
std::cout<<"大顶堆如下所示:";
for(i = 1;i<=len;i++)
std::cout<<list[i]<<" ";
std::cout<<std::endl;
//排序
for(i = len;i>=1;--i)
{
swap(&list[1],&list[i]) ;//将大顶堆元素与数组的最后一个位置交换,即出堆
HeapAdjust(list,1,i-1) ;//调整堆
}
}
void testHeap()
{
int a[] = {-1,8,5,2,4,9,0,1,6,7,3} ;//建立堆的元素从a[1.....10],a[0]保留
HeapSort(a,10) ;
for(int i = 1 ;i<=10;i++)
std::cout<<a[i] <<" ";
std::cout<<std::endl;
}
int main()
{
testHeap() ;
system("pause") ;
return 0 ;
}
算法复习之堆排序
最新推荐文章于 2020-12-26 21:35:02 发布