/*说明:堆排序其实就是反复建堆的过程
先建一个大顶堆,找到最大值和最小值
然后从后往前添加到堆里面去,进行建推
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
//只调整i,将i到n调整为大顶堆
void heapAdjust(int *a, int i, int n)
{
int child;
int tmp;
for (; 2*i+1<n; i=child)
{
//沿着子树搜索
child = 2*i+1;
//找到子树中大的
if (child<n-1 && a[child+1]>a[child])
{
child++;
}
//和父节点比较
if (a[i]<a[child])
{
swap(&a[i], &a[child]);
}
else
break;
}
}
void heapSort(int *a, int n)
{
int tmp;
int i;
//调整前半部分,完成后第一个元素为最大元素
for (i=n/2-1; i>=0; i--)
{
heapAdjust(a, i, n);
}
//从最后一个元素开始调整,不断缩小范围
for (i=n-1; i>0; i--)
{
//把第一个元素和当前元素交换
//保证最后一个元素是这个序列最大的
swap(&a[0], &a[i]);
//调整保证第一个元素为最大值
heapAdjust(a, 0, i);
}
}
int main()
{
int a[] = {11,2,3,4,5,6,7,8,10};
heapSort(a, 10);
for (int i=0; i<9; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
return 0;
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布