void heapsort(int n, int ar[])
{
int i;
int heap_size = n;
build_max_heap(n,ar);
for(i=n-1;i>=1;i--)
{
int temp;
temp = ar[0];
ar[0] =ar[i];
ar[i] = temp;
/* 交换堆顶值与堆末值 */
heap_size--;
/* 使堆长减一 */
max_heapify(ar,0,heap_size);
/* 对新的堆顶值执行heapify,找出新的最大值 */
}
}
void max_heapify(int ar[],int i,int heap_size)
{
int largest; //小堆的最大值的索引
int l = left(i);
int r = right(i);
if(l<heap_size && ar[l]>ar[i]) //左孩子大于父亲
largest = l;
else if(r<heap_size && ar[r]>ar[i]) //右孩子大于父亲
largest = r;
else //父亲最大
largest = i;
if(largest != i) //需要发生值的交换
{
int temp = ar[i];
ar[i] = ar[largest];
ar[largest] = temp;
/* 交换父亲与大孩子 */
max_heapify(ar,largest,heap_size);
/* 对被交换的大孩子的位置继续调用heapify */
}
}
void build_max_heap(int n, int ar[])
{
int heap_size = n;
int i;
for(i=heap_size/2-1;i>=0;i--)
max_heapify(ar,i,heap_size);
/* 对每个内部节点从尾至首调用heapify */
}
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i+1;
}
C语言实现堆排序
最新推荐文章于 2023-04-21 11:47:07 发布