堆排序算法

来源:互联网 发布:imovie windows 编辑:程序博客网 时间:2024/06/12 00:20
void test::HeapAdjust(int *a,int i,int size)
{
int lchild = 2 * i;//i的左孩子节点
int rchild = 2 * i + 1;//右孩子节点
int max = i; //临时变量
if(i <= size/2)
{
if(lchild<=size&&a[lchild]>a[max])
{
max=lchild;
}


if(rchild<=size&&a[rchild]>a[max])
{
max=rchild;
}


if(max!=i)
{
swap(a[i],a[max]);
HeapAdjust(a,max,size);//避免调整后以max为节点的子树不是堆
}
}
}


void test::BuildHeap(int *a,int size)//建立堆
{
int i;
for(i = size/2;i>=1;i--)
{
HeapAdjust(a,i,size);
}
}


void test::HeapSort(int *a,int size)//堆排序
{
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--)
{
swap(a[1],a[i]);
HeapAdjust(a,1,i-1);
}
}
0 0
原创粉丝点击