堆排序-TOP-K问题(C语言数据结构)

2024-08-27 06:04

本文主要是介绍堆排序-TOP-K问题(C语言数据结构),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

        学习堆及堆排序,认识到堆的内部原理,这时候就应该运用在实体场景。

        例如:全校有2000人,如何帅选出成绩最好的前10名。

                   帅选出全球前100所最具潜力的公司等等。

TOP-K问题:

如何创造出多个数据?

        在32位机器上整型占4个字节,电脑一般自带内存是8GB或者16GB,也就是最多存储

2,147,483,648个整型数据。

        如果一次性的数量比较大超过了21亿,此时就需要将数据存储在硬盘上面,通常硬盘的内存会比较大,当我们需要的时候在硬盘上去读取数据即可。

将数据写入文件中:

        这里涉及到如何将数据写入文件中,也就是文件相关的操作:文件操作(1)(C语言版)-CSDN博客

        可以根据以前写的文章进行复习。

在这里我们将数据写入文件中用fprintf,读取时用fscanf。(运用格式化读写会比较方便!)

将文件打开并将数据写入:

void CreatData()
{srand((unsigned int)time(NULL));char name[] = { "data.txt" };int arr[100000];int a = 0;FILE* data = fopen(name, "w");if (data == NULL){perror("fopen ::error");exit(-1);}for (int i = 0; i < 100000; i++){a = (rand() + i) % 10000;arr[i] = a;}for (int i = 0; i < 100000; i++){fprintf(data,"%d\n",arr[i]);}fclose(data);
}

TOP-K思路:

        因为小堆的最上层是最小的,如果没有比堆里面最小的大,那么就是最大的10个

主要思路还是“沉底思想”

代码:

void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void AdjustDown(HPDataType* a, int size, int parent)
{//假设最大的孩子的值是左孩子对应的数值int childmax = (parent * 2) + 1;while (childmax < size){//如果右有孩子并且右孩子的值是大于左孩子将最大的孩子换成右孩子if (childmax + 1 < size && a[childmax + 1] < a[childmax]){childmax = childmax + 1;}if (a[parent] > a[childmax]){swap(&a[parent], &a[childmax]);parent = childmax;childmax = (parent * 2) + 1;}else{break;}}
}
void swap(HPDataType* a, HPDataType* b)
{HPDataType c = 0;c = *a;*a = *b;*b = c;
}
void CreatData()
{srand((unsigned int)time(NULL));char name[] = { "data.txt" };int arr[100000];int a = 0;FILE* data = fopen(name, "w");if (data == NULL){perror("fopen ::error");exit(-1);}for (int i = 0; i < 100000; i++){a = (rand() + i) % 10000;arr[i] = a;}for (int i = 0; i < 100000; i++){fprintf(data,"%d\n",arr[i]);}fclose(data);
}
void test3()
{//创造数据CreatData();FILE* data = fopen("data.txt", "r");if (data == NULL){perror("fopen :error");exit(-1);}int k = 10;//创建堆int* heap = (int*)malloc(sizeof(int) * k);if (heap == NULL){perror("heap::error");exit(-1);}//建立k个数的小堆for (int i = 0; i < k; i++){fscanf(data,"%d",&heap[i]);AdjustUp(heap,i);}//比较所有的数,如果有大于堆顶的将覆盖,并向下调整int a = 0;while (fscanf(data,"%d",&a) != EOF){if (heap[0] < a){heap[0] = a;AdjustDown(heap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", heap[i]);}free(heap);heap = NULL;fclose(data);
}

这篇关于堆排序-TOP-K问题(C语言数据结构)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110839

相关文章

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服