Heapsort

简介: Heapsort

一,概念

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
堆排序的平均时间复杂度为 Ο(nlogn)。

二,算法思想:

堆排序的基本思想是:1、将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素;2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆;3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。最后,就得到一个有序的序列了

三,代码:


#include<stdio.h>
#include<stdlib.h>
//堆排序用于查找最大值 或者 最小值
void show(int *p, int n)
{
    for (int i = 0; i < n;i++)
    {
        printf("%4d", p[i]);
    }
    printf("\n");
}
void findmax(int *arr, int size)
{
    for (int j = size - 1; j>0; j--)//从尾部循环到头部
    {
        int parent = j / 2;//定义
        int child = j;//记录当前下标
        if (j < size - 1 && arr[j]< arr[j + 1])//该行的j<size-1 可以避免数组越界
        {
                child++;
        }
        if (arr[child]>arr[parent])
        {
            int temp = arr[child];
            arr[child] = arr[parent];
            arr[parent] = temp;
        }
    }
}
void heapsort(int *arr, int size)
{
    for (int j = size; j > 0; j--)
    {
        findmax(arr, j);
        int temp = arr[0];
        arr[0] = arr[j - 1];
        arr[j - 1] = temp;
    }
}
void heapsort1(int *arr, int size)
{
    
    for (int i = 0; i < size; i++)
    {
        findmax(arr + i, size-i);
    }
}
void main()
{

    int a[11] = { 10, 13, 99, 12, 30, 14, 50, 19, 60, 29 };
    int b[6] = { 2, 5, 66, 25, 8, 99 };
    //printf("%d\n", a[10]);
    //int *pp = a;
    //printf("%d", pp[10]);
    //show(b, 6);
    //findmax(a, 11);
    //show(a, 11);
    //heapsort(a, 11);
    heapsort1(a, 10);
    show(a, 11);

}


void findmax1(int *arr1, int size1)
{
    int *arr = arr1;
    int size = size1;
    for (int i = 0; i < size1; i++)
    {
        arr = arr1;
        arr = arr + i; 
        size = size1 - i;
        for (int j = size-1; j > 0; j--)//从尾部循环到头部
        {
            int parent = j / 2;//定义
            int child = j;//记录当前下标
            if (j < size - 1 && arr[j]< arr[j + 1])//该行的j<size-1 可以避免数组越界
            {
                child++;
            }
            if (arr[child]>arr[parent])//最大值攀顶
            {
                int temp = arr[child];
                arr[child] = arr[parent];
                arr[parent] = temp;
            }
        }
    }
}
相关文章
|
NoSQL 安全 Linux
Linux|minio对象存储服务的部署和初步使用总结
Linux|minio对象存储服务的部署和初步使用总结
854 0
|
API 数据处理 数据安全/隐私保护
curl基础用法
curl基础用法
欧拉筛(最优的方法,对于找质数,细节讲解)
欧拉筛(最优的方法,对于找质数,细节讲解)
337 0
|
Shell Linux Python
基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案(一)
基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案
7214 0
基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案(一)
|
9月前
|
运维 算法 数据管理
2025有哪些好用的电话系统推荐?(详解电话系统4大核心功能)
电话系统基于CTI和云计算技术,集成了电话、在线客服、短信等多媒体通讯方式,提供高效、多元化的沟通渠道。其核心功能包括高效呼叫、对接集成、智能化服务和数据管理。
373 12
|
7月前
|
Web App开发 存储 安全
macOS Sequoia 15.4.1 (24E263) Boot ISO 原版可引导镜像下载
macOS Sequoia 15.4.1,2025 年 4 月 17 日,仅问题修复和安全更新。
1143 6
macOS Sequoia 15.4.1 (24E263) Boot ISO 原版可引导镜像下载
|
9月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
修改apt-get源为国内镜像源
修改apt-get源为国内镜像源
5996 0
|
人工智能 机器人 数据安全/隐私保护
计算巢AppFlow实现模型对话流式输出
使用AppFlow现在可以实现大模型对话在钉钉群聊中的流式输出效果,无需编程,只需简单几步配置。首先在钉钉开放平台创建应用,获取Client ID和Client Secret。接着在钉钉卡片平台创建AI卡片实例,关联之前创建的应用。然后在AppFlow中选择模板创建连接流,配置钉钉卡片模版ID和WebhookUrl,发布连接流。最后在钉钉应用中设置机器人,选择HTTP模式并填入WebhookUrl,发布应用。完成这些步骤后,即可在钉钉群中与通义千问、通义百炼模型进行流式对话。如有问题,可加入官方支持钉钉群咨询。
441 13