【C语言】【堆排序实现TOPK问题】写一个堆排序,并且在一百万个数中找出最大的前K个

1.堆排序的实现:

如果要升序输出,则实现大堆
如果要降序输出,则实现小堆

逻辑:(升序输出)
将堆顶的元素和最后一个元素交换位置,此时左子树和右子树分别仍是大堆的顺序,交换位置后选出了最小的数。接着向下调整使剩余的元素再成为一个大堆,然后再交换,选出第二小的数…
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码:
Heap.h:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<time.h>
void Swap(int* p1, int* p2);
void AdjustDown(int* a, int n,int parent);
void AdjustUp(int* a, int child);
void HPSort(int* a, int n);

Heap.c:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"Heap.h"void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
//向下调整:(建小堆)
void AdjustDown(int* a, int n,int parent)
{int child = 2 * parent + 1;while (child < n){if (child + 1 < n && a[child + 1] > a[child]){child = child + 1;}if (a[parent] < a[child]){Swap(&a[parent], &a[child]);parent = child;child = 2 * child + 1;}elsebreak;}
}
//向上调整:(建大堆)
void AdjustUp(int*a,int child)
{assert(a);	int parent = (child - 1) / 2;while (child != parent){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (parent - 1) / 2;}elsebreak;}}//堆排序(升序):
void HPSort(int* a,int n)
{int end = n - 1;//建立大堆:for (int i = 1;i < n;i++){AdjustUp(a, i);}while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}

2.TopK问题

将生成的一百万个随机数写入文件里面:
(Heap.h和Heap.c未改动)

#include"Heap.h"
//造数据:
void CreateData()
{int n = 1000000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0;i < n;i++){int x = (rand() + i) % 10000000;fprintf(fin, "%d\n", x);}fclose(fin);
}
//打印最大的k个数:
void PrintTopk(const char* file, int k)
{FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int* minheap = (int*)malloc(sizeof(int) * k);int x = 0;for (int i = 0;i < k;i++){fscanf(fout, "%d", &minheap[i]);AdjustUp(minheap, i);}while (fscanf(fout, "%d", &x) != EOF){if (x > minheap[0]){minheap[0] = x;AdjustDown(minheap, k, 0);}}for (int i = 0;i < k;i++){printf("%d ", minheap[i]);}printf("\n");free(minheap);fclose(fout);
}
int main()
{CreateData();PrintTopk("data.txt", 5);return 0;
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保障Adams许可管理数据库安全:备份与恢复的最佳实践

在工程仿真领域&#xff0c;Adams软件是一款广泛应用于动力学分析的工具。然而&#xff0c;随着项目的不断扩大和复杂化&#xff0c;如何备份和恢复Adams许可管理数据库成为了一个重要的问题。为了帮助用户更好地理解和掌握Adams许可管理数据库备份与恢复的最佳实践&#xff0c…

【matlab程序】matlab画螺旋图|旋转图

%% 数学之美====》螺旋线 % 海洋与大气科学 % 20231205 clear;clc;close all; n=10; t=0:0.01:2pin; R=1; xx=nan(length(t),1);yy=nan(length(t),1); for i=1:length(t) xx(i)=Rcos(t(i)); yy(i)=Rsin(t(i)); R=R+1; end figure set(gcf,‘position’,[50 50 1200 1200],‘col…

中文手写数字数据识别

实验环境 python3.7torch1.13.1cu117 torchaudio0.13.1cu117 torchvision0.14.1数据下载地址&#xff1a;Mnist中文手写数字数据集Python资源-CSDN文库 这些汉字包括&#xff1a; 零、一、二、三、四、五、六、七、八、九、十、百、千、万、亿 总共15个汉字&#xff0c;分别…

浅谈ArrayBuffer、Blob和File、FileReader

ArrayBuffer、Blob和File都是JavaScript中处理二进制数据的对象。 ArrayBuffer 用于表示一个通用的、固定长度的原始二进制数据缓冲区。它不能直接操作缓冲区中的数据&#xff0c;而需要通过一个类型化数组TypedArray&#xff08;如Int8Array、Uint8Array等&#xff09;或者一…

linux 中crontab 定时任务计划创建时间文件夹示例

1.创建一个sh脚本 /usr/bin/mkdir 是mkdir命令的路径 /usr/bin/chmod 是chmod命令的路径 2.编辑定时任务 crontab -e

爆款开放式耳机哪一款性价比最高?3款热门机型推荐,小白速看

随着生活水平的提升&#xff0c;越来越多的人对蓝牙耳机的需求不再局限于简单的音乐欣赏。他们对耳机的要求越来越高&#xff0c;包括音质表现、舒适度、环境感知等方面也有极大的期待&#xff0c;正是因为这样&#xff0c;开放式耳机应运而生。 身为一个数码测评小博主&#x…

C++ 12.5作业

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

谈一谈define,枚举,const,内联

define #define命令是C语言中的一个宏定义命令&#xff0c;它用来讲一个标识符定义为一个字符串&#xff0c;该标识符被称为宏名&#xff0c;被定义的字符串称为替换文本。该命令有两种格式&#xff1a;一种是简单的宏定义&#xff08;不带参数的宏定义&#xff09;&#xff0…

音乐律动效果

先上图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>音乐律动效果</title><style>* {margin: 0;padding: 0;}li {list-style: none;}.container .img {width: 200px;height: 200…

Git介绍与安装使用

目录 1.Git初识 1.1提出问题 1.2如何解决--版本控制器 1.3注意事项 2.Git安装 2.1Linux-centos安装 2.2Linux-ubuntu安装 2.3Windows安装 3.Git基本操作 3.1创建Git本地仓库 3.2配置Git 4.认识⼯作区、暂存区、版本库 1.Git初识 1.1提出问题 不知道你工作或学习时…

docker: Error response from daemon: failed to create shim task: OCI runtime

1 概述 在解决"Docker: Error response from daemon: failed to create shim task: OCI runtime"问题之前&#xff0c;我们先来了解一下Docker和OCI runtime的基本概念。 Docker是一个开源的应用容器引擎&#xff0c;可以帮助开发者将应用程序和其依赖打包到一个可…

VBA技术资料MF92:将多个Excel表插入Word文档的不同位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

从零开始,轻松实现Python接口自动化测试(基于PyCharm)

1.接口清单整理 &#xff08;1&#xff09;请求&#xff1a; 请求URL请求方法请求参数请求报文 &#xff08;2&#xff09;响应 状态码响应数据 2.用例设计 &#xff08;1&#xff09;单接口测试用例 模板&#xff1a;id、模块、接口名称、请求URL、用例名称、请求方法、…

linux api daemon,后台运行进程

主流程: 调用fork()函数&#xff0c;创建一个子进程&#xff0c;然后使父进程退出&#xff0c;这样就能保证子进程不再有控制终端。 调用setsid()函数&#xff0c;创建一个新的会话期&#xff08;session&#xff09;&#xff0c;并使当前进程成为该会话期的首进程和组长进程&…

解决typescript报错:找不到名称xxx

现象&#xff1a; 原因&#xff1a;在同时导入默认导出和命名导出时&#xff0c;默认导出必须放在命名导出之前 下面的就是原始文件&#xff1a; 默认导出指&#xff1a; export default导出类型&#xff0c; import时无需大括号 命名导出指&#xff1a; 仅有export关键字…

优化汽车产业用户营运:精细化策略

近年来随着互联网时代新技术浪潮的冲击&#xff0c;商业社会中各种原生边界不断被打破&#xff0c;新的消费需求、新的商业模式、新的竞争挑战层出不穷。各行业往往面临重重困境与迷思&#xff0c;学会如何精细化运营用户显得尤为重要。立即阅读阅文&#xff0c;详细了解其中用…

java中一个空的Object对象在HotSpot虚拟机中占用多大的内存空间?

在HotSpot虚拟机中&#xff0c;一个空的Object对象在64位的环境下通常占用约 16 字节的对象头。 这个对象头包括&#xff1a; 标记字&#xff08;Mark Word&#xff09;&#xff1a; 8 字节&#xff0c;用于存储对象的状态信息、锁信息等。类型指针&#xff08;Class Pointer&…

手动创建spring bean并注入

文章目录 前言一、jar包中,相同class不同类加载器加载的时候是同一个class嘛&#xff1f;二、利用ConfigurableListableBeanFactory手动注册bean注册bean,并自动注入依赖bean根据类型获取注入的bean,两个bean是一个吗? 三、同一份字节码,class隔离,bean隔离总结 前言 注入一个…

【Python百宝箱】Python引领虚拟奇境:探索VR和AR开发的利器库

穿越数字之门&#xff1a;Python库助您打造虚拟现实与增强现实未来 前言 虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术正在迅速崛起&#xff0c;为我们的数字体验提供了全新的可能性。在这个充满创新的领域中&#xff0c;选择合适的工具和库…

python打包exe,打包好后,启动exe报错找不到paddleocr

目录 1、安装pyinstaller 2、生成脚本文件的.spce文件 3、资源文件配置 4、生成exe文件 5、使用了paddleocr启动exe后报错 6、配置.spce文件 7、重新生成exe文件 8、关于图片找不到的问题 参考&#xff1a;PaddleOCR打包exe--Pyinstaller_paddleocr 打包exe_mjiansun的博…