堆排(大顶堆C语言)

堆排(大顶堆C语言)

借鉴的别人的代码自己做了一些注释便于理解

#include <stdio.h>
#include <stdlib.h>

//这是一个大顶堆,实现从小到大排序 !!堆顶序号从1开始编号!!

void swap(int k[] ,int i ,int j)
{
int temp = k[i];
k[i] = k[j];
k[j] = temp;
} //交换堆顶和最后一个节点的数据(具体使用时i = 1,即第一个节点下标,j就是最后一个节点的下标)

void heapadjust(int k[],int s,int n)//k:数组指针,s:父节点下标,n:末尾节点下标
{
int i,temp;
for( i = 2*s;i <= n;i *= 2)
{
temp = k[s];
if (i < n&&k[i] < k[i+1]) i++;//找到两孩子节点中更大的那个孩子节点
if(temp > k[i]) break;//不需要修正节点则退出循环
k[s] = k[i];//父节点的值赋为更大的孩子节点的值
s = i;//更大的孩子节点成为下次循环的父节点
k[s] = temp;//更大的孩子节点的值赋为父节点的值//这一行与k[s] = k[i] 实际上就是交换两节点的值
}//循环是从输入的父节点位置开始一直到最后的节点都进行堆调整
}//堆调整,从父节点一直往下调整

void heapsort(int k[],int n) //k:数组指针,n:末尾节点下标
{
int i;
for(i = n/2 ;i > 0 ;i --)
{
heapadjust(k ,i ,n);
}//从n/2节点处从右往左从下往上调整堆,使得这个堆成为一个大顶堆,即堆的初始化
for(i = n ;i > 1 ;i --)
{
swap(k,1,i);//交换堆顶节点和末尾节点
heapadjust(k,1,i-1);//将除去末尾节点的其他数据再进行堆调整使之成为大顶堆
}
}//堆排序

int main()
{
int i;
int k[22] = {0,1,4,5,2,9,6,3,8,7,13,6,96,86,54,32,52,15,36,84,62,45};
heapsort(k,21);
for(i = 1;i <= 21;i++)
{
printf("%d ",k[i]);
}
return 0;
}

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值