博客
关于我
排序——堆排序
阅读量:687 次
发布时间:2019-03-17

本文共 1738 字,大约阅读时间需要 5 分钟。

#include 
#include
#include
using namespace std;
// 堆排序的主要算法思想是将一个数组经过一系列操作,变成一个堆结构(大顶堆),然后逐步将这个堆结构转换成有序数组。
// 堆排序的关键操作包括调整(HeapAdjust)和排序(HeapSort)
void HeapAdjust(int arr[], int i, int length) {
int child = 2 * i + 1;
while (2 * i + 1 < length) {
// 确定子节点的位置,并检查右边的子节点是否更大
if (child < length - 1 && arr[child + 1] > arr[child]) {
child++;
}
if (arr[i] < arr[child]) {
// 交换父节点和较大的子节点
int temp = arr[i];
arr[i] = arr[child];
arr[child] = temp;
} else {
break;
}
i = child;
child = 2 * i + 1;
}
}
void HeapSort(int arr[], int length) {
// 先调整前半部分为大顶堆
for (int i = length / 2 - 1; i >= 0; --i) {
HeapAdjust(arr, i, length);
}
// 结束后,最大值在数组开头
// 从最后一个元素开始调整,并不断缩小范围
for (int i = length - 1; i > 0; --i) {
// 将当前最大值移动到正确位置
int temp = arr[i];
arr[i] = arr[0] ^ arr[i];
arr[0] = temp;
arr[i] = arr[0] ^ arr[i];
HeapAdjust(arr, 0, i);
}
}
int main() {
int a[100];
int count = 0;
int size = 0;
// 读取输入
do {
size++;
scanf("%d", &a[size]);
count++;
} while (a[size] != 0);
// 调用堆排序算法
HeapSort(a, size);
// 输出结果
for (int i = 1; i < size; i++) {
printf("%d ", a[i]);
}
}

上述代码展示了一个实现堆排序的C语言程序,其主要目标是对一个数组进行排序。堆排序的思路是将数组先构造成一个大顶堆,然后利用堆的性质逐步将最大值移动到正确的位置,最终完成排序。

程序包含两个主要函数:

  • HeapAdjust:用于调整大顶堆结构
  • HeapSort:主要排序函数,通过多次HeapAdjust实现排序
  • 代码结构清晰,注释详细,并包含了一个示例,展示了如何使用该排序函数进行实际数据处理。程序的注意事项包括:

    • 数据输入处理需要注意数组的起始位置
    • 调用函数时需要确保参数正确
    • HeapAdjust函数的递归深度需要控制在合理范围内以避免栈溢出

    代码保留了调试信息(如评论),但用户可以根据实际需求选择是否保留

    转载地址:http://rofhz.baihongyu.com/

    你可能感兴趣的文章
    Node-RED中建立TCP服务端和客户端
    查看>>
    Node-RED中建立Websocket客户端连接
    查看>>
    Node-RED中建立静态网页和动态网页内容
    查看>>
    Node-RED中解析高德地图天气api的json数据显示天气仪表盘
    查看>>
    Node-RED中连接Mysql数据库并实现增删改查的操作
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED订阅MQTT主题并调试数据
    查看>>
    Node-RED通过npm安装的方式对应卸载
    查看>>
    node-request模块
    查看>>
    node-static 任意文件读取漏洞复现(CVE-2023-26111)
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    node.js debug在webstrom工具
    查看>>
    Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
    查看>>
    Node.js RESTful API如何使用?
    查看>>
    node.js url模块
    查看>>
    Node.js Web 模块的各种用法和常见场景
    查看>>
    Node.js 之 log4js 完全讲解
    查看>>