当前位置: 首页 > news >正文

数据结构例程——选择排序之堆排序

本文是[数据结构基础系列(9):排序]中第7课时[选择排序之堆排序]的例程。

对算法运行过程,补充了一个示例,见[补充示例]。

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定义关键字类型
typedef char InfoType[10];
typedef struct          //记录类型
{
    KeyType key;        //关键字项
    InfoType data;      //其他数据项,类型为InfoType
} RecType;              //排序的记录类型定义

//调整堆
void sift(RecType R[],int low,int high)
{
    int i=low,j=2*i;                        //R[j]是R[i]的左孩子
    RecType temp=R[i];
    while (j<=high)
    {
        if (j<high && R[j].key<R[j+1].key)  //若右孩子较大,把j指向右孩子
            j++;                                //变为2i+1
        if (temp.key<R[j].key)
        {
            R[i]=R[j];                          //将R[j]调整到双亲结点位置上
            i=j;                                //修改i和j值,以便继续向下筛选
            j=2*i;
        }
        else break;                             //筛选结束
    }
    R[i]=temp;                                  //被筛选结点的值放入最终位置
}

//堆排序
void HeapSort(RecType R[],int n)
{
    int i;
    RecType temp;
    for (i=n/2; i>=1; i--) //循环建立初始堆
        sift(R,i,n);
    for (i=n; i>=2; i--) //进行n-1次循环,完成推排序
    {
        temp=R[1];       //将第一个元素同当前区间内R[1]对换
        R[1]=R[i];
        R[i]=temp;
        sift(R,1,i-1);   //筛选R[1]结点,得到i-1个结点的堆
    }
}

int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {0,6,8,7,9,0,1,3,2,4,5};//a[0]空闲,不作为关键字
    for (i=1; i<=n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=1; i<=n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    HeapSort(R,n);
    printf("排序后:");
    for (i=1; i<=n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}

相关文章:

  • java中的继承
  • ​批处理文件中的errorlevel用法
  • 上转型对象
  • 方法重写与成员变量隐藏
  • ScriptManager(脚本控制器)
  • espcms会员二次开发文件说明——会员,时间格式
  • 问题4_1(已解决)
  • final关键字
  • abstract关键字
  • java中的接口
  • Android---利用android-async-http开源项目返回json数据
  • 内嵌类
  • 匿名类
  • swift学习之-- UIAlertViewController -alert
  • 系统异常
  • [笔记] php常见简单功能及函数
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • bootstrap创建登录注册页面
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • C语言笔记(第一章:C语言编程)
  • es6--symbol
  • extjs4学习之配置
  • Fundebug计费标准解释:事件数是如何定义的?
  • Intervention/image 图片处理扩展包的安装和使用
  • Java面向对象及其三大特征
  • MD5加密原理解析及OC版原理实现
  • node.js
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 搭建gitbook 和 访问权限认证
  • 第2章 网络文档
  • 讲清楚之javascript作用域
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何用vue打造一个移动端音乐播放器
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一起参Ember.js讨论、问答社区。
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #微信小程序(布局、渲染层基础知识)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (6)STL算法之转换
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (七)Knockout 创建自定义绑定
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core使用ef 6
  • .NET Framework 服务实现监控可观测性最佳实践