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

本文共 1684 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    OJ中常见的一种presentation error解决方法
    查看>>
    OK335xS UART device registe hacking
    查看>>
    ok6410内存初始化
    查看>>
    OKR为什么到今天才突然火了?
    查看>>
    ollama本地部署DeepSeek(Window图文说明)
    查看>>
    onCreate()方法中的参数Bundle savedInstanceState 的意义用法
    查看>>
    OneBlog Shiro 反序列化漏洞复现
    查看>>
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    oobbs开发手记
    查看>>
    OPEN CASCADE Curve Continuity
    查看>>
    Open Graph Protocol(开放内容协议)
    查看>>
    Open vSwitch实验常用命令
    查看>>
    Open WebUI 忘了登入密码怎么办?
    查看>>
    open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
    查看>>
    Openbox-桌面图标设置
    查看>>
    opencart出现no such file or dictionary
    查看>>
    opencv Mat push_back
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>