/*************************************************************************
> File Name: 6-堆排序.c
> Author:
> Mail:
> Created Time: Wed 16 Mar 2022 09:02:27 AM CST
堆排序思路;
把数组看成二叉树,由上往下,由左往右作为数组位置例如:int a[]={2,0,4,5,6,0};
┊ ┊ 2
┊ 0 4
┊5 6 0
由下往上构建大根堆:即让父节点大于等于孩子节点,所以构建大根堆之后,根节点数值最大,把根节点值和最后节点交换,
由根节点往下调整关系,再次让根节点为最大值,再和倒数第二个交换,不断循环......
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void AudjctHeapSort(int*a,int root,int end )
{
int child;
int tmp=a[root];
for(;2*root+1<=end;root=child)//循环条件表示: 在有孩子下,比较父子大小,比较完成后,把root位置(父节点)改到孩子位置上,这样就可以确保修改父节点,同时也会去检查、修改下面的节点
{
┊ child=2*root+1;//左孩子
┊ if(child+1<=end && a[child]<a[child+1])//右孩子存在,并且左孩子小于右孩子,child++,即右孩子,没有右孩子的话下面代码就是左孩子和父节点比较
┊ {
┊ ┊ child++;
┊ }
┊ if( a[child]>a[root] )//如果上面的左孩子没有小于右孩子,child表示的左孩子,反之右孩子,孩子和父节点比较,孩子大于父节点就父子交换值
┊ {
┊ ┊ a[root]=a[child];
┊ ┊ a[child]=tmp;
┊ }
}
}
void HeapSort(int *a,int len)
{
int i;
for(i=len/2-1;i>=0;i--)
{
┊ AudjctHeapSort(a,i,len-1);//由下往上构建大根堆
}
for(i=len-1;i>0;i--)
{
┊ int tmp=a[i];//堆顶元素依次和最后一个、倒数第二、、、、交换位置
┊ a[i]=a[0];
┊ a[0]=tmp;
┊ AudjctHeapSort(a,0,i-1);//由堆顶往下调整大根堆,i-1表示,修改倒数第二个元素作为最后一个元素
}
}
int main()
{
int a[]={2,0,4,5,6,0};
HeapSort(a,sizeof(a)/sizeof(int));
for(int i=0;i<sizeof(a)/sizeof(int);i++)
{
┊printf("%d ",a[i]);
}
printf("/n");
return 0;
}
堆排序--c语言
最新推荐文章于 2024-08-07 12:24:41 发布