堆排 和 Topk

news/2024/5/20 6:29:25 标签: , 数据结构, c语言

 1.

 

             排是利用来进行排序的,分为向上调整建,和向下调整建

              分为大和小,大一般排升序,小排降序

    向下调整建

            把数据中每个父亲节点全调整一遍(从后到前的父亲节点)

            这样就会得到一个有序的

排序

  建完之后,首位为最大项,让首位和末尾交换,再向下调整(不过范围是末尾的前一位);

 依次直到剩下首元素,升序就排好了

//交换
void swap(int* A, int* B)
{
    int temp = *A;
    *A = *B;
    *B = temp;
}
//向下调整
void AdjustDown(int* a, int n, int parents)
{
    int child = parents * 2 + 1;
    while (child < n)
    {
        if (child + 1 < n && a[child + 1] > a[child])
        {
            ++child;
        }
        if (a[parents] < a[child])
        {
            swap(parents + a, child + a);//交换程序
            parents = child;
            child = parents * 2 + 1;
        }
        else
        {
            break;
        }
    }
}
//排序
void HeapSort(int* a, int n)
{
    //建;
    for (int i = (n - 1 - 1) / 2;i >= 0;--i)
    {
        AdjustDown(a, n, i);
    }
    //排序;
    for (int i = 0;i < n-1;i++)
    {
        swap(a, a + n - 1 - i);
        AdjustDown(a, n- 1- i, 0);
    }
}

 2.Topk.

  Topk是寻找最大或最小的前k位,如果你把数据排序后寻找的话效率很低

 所以这里我们只建k的元素的(找最大建小,找最小建大),

 若我们找最大前k项,就建一个k元素的小再用顶的元素与剩下的元素对比

 若大于顶元素则于顶元素交换,再进行向下调整,这样会发现内的元素再

 增大,最后存的就是最大前k项(最小前k项同理).

//交换
void swap(int* A, int* B)
{
    int temp = *A;
    *A = *B;
    *B = temp;
}
//向下调整
void AdjustDown(int* a, int n, int parents)
{
    int child = parents * 2 + 1;
    while (child < n)
    {
        if (child + 1 < n && a[child + 1] < a[child])
        {
            ++child;
        }
        if (a[parents] > a[child])
        {
            swap(parents + a, child + a);//交换程序
            parents = child;
            child = parents * 2 + 1;
        }
        else
        {
            break;
        }
    }
}
void HeapTopk(int* a, int n, int k)
{
   //建
    for (int i = (k - 1) / 2;i >= 0;--i)
    {
        AdjustDown(a, k, i);
    }
    //排k
    for (int i = k;i < n;i++)
    {
        if (a[i] > a[0])
        {
            swap(a + i, a);
            AdjustDown(a, k, 0);
        }
    }
}


http://www.niftyadmin.cn/n/184935.html

相关文章

基于springboot实现人事管理系统演示【附项目源码】分享

基于springboot实现人事管理系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xf…

【实用干货】MCM 箱模型建模方法及大气 O3 来源解析

OBM 箱模型可用于模拟光化学污染的发生、演变过程&#xff0c;研究臭氧的生成机制和进行敏感性分析&#xff0c;探讨前体物的排放对光化学污染的影响。箱模型通常由化学机理、物理过程、初始条件、输入和输出模块构成&#xff0c;化学机理是其核心部分。MCM (Master Chemical M…

Linux简单入门命令

1>帮助手册 man命令 用法:man 手册编号 命令名 2>用户切换 $ su Eric切换到Eric这个用户$ su切换到特权用户root 注意:Ubuntu默认情况没有合法root权限,不能直接使用su命令提升到root权限,只能使用sudo获取root权限 3>特权命令 $ sudo su切换到root用户$ sudo r…

Kibana导出csv数据

适用版本 ElasticSearch-6.8.0 Kibana-6.8.0 导出CSV文件配置 kibana配置文件 添加以下配置 xpack.reporting.csv.maxSizeBytes: 209715200 # csv文件大小,默认为10485760&#xff08;10MB&#xff09; xpack.reporting.queue.timeout: 3000000 # 超时时间,默认是120000(…

LeetCode SQL 584. 寻找用户推荐人 简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

[Django]创建项目+创建应用+启动服务

创建项目 django-admin startproject sign这样就会在当前目录下创建一个叫做sign的Django项目 可以看到Django自动帮我们创建了一个sign文件夹&#xff0c;这是项目的根目录&#xff0c;在sign根目录中&#xff0c;又有一个sign目录&#xff0c;这是整个项目的配置文件目录&a…

MAL-PEG-FITC荧光素-聚乙二醇-马来酰亚胺的结构式

FITC-PEG-MAL 荧光素-聚乙二醇-马来酰亚胺 中文名称&#xff1a;荧光素-聚乙二醇-马来酰亚胺 英文名称&#xff1a;Fluorescein PEG Maleimide,FITC-PEG-MAL 性状&#xff1a;白色粉末或者粘稠状液体&#xff08;分子量大小决定外观&#xff09; 溶剂&#xff1a;溶于水和…

基于Servlet房屋租赁管理信息系统(含前后台)(Java+Servlet+jsp+mysql)

一、技术选择 环境配置&#xff1a; Jdk1.8 web服务器&#xff1a;Tomcat7及以上 数据库 mysql 开发环境 Eclispe (IntelliJ IDEA,Eclispe,MyEclispe) 前端&#xff1a;jsp&#xff0c;css&#xff0c;JavaScript&#xff0c;JQuery&#xff0c;Ajax&#xff0c;轮播图效果。…