【数据结构—堆排序、top k问题和时间复杂度】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

一、堆排序(升序)

1.1向上调整算法:

1.2向下调整算法:

1.3、堆排序的实现:

二、top k问题

2.1top k问题的代码实现:

 2.2如何保证取出的前k个数就是N个数里面最小的前k个数呢?

2.3实际数据测试展示:

三、时间复杂度

总结


前言

提示:这里可以添加本文要记录的大概内容:

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

一、堆排序(升序)

实现数组的排序:

方法一:利用堆来实现排序的话,但是realloc()函数来申请空间。

方法二:我们可以把一个现有数组直接建堆,可以不用申请额外的空间,直接在数组这个结构上直接动手。

1.1向上调整算法:

1.2向下调整算法:

1.3、堆排序的实现:

升序:要建大堆先选出最大的数,然后把首位的值一交换,相当于最后一个数排好了,那最后一个数就不要动了,可以把最后一个数不在看作堆内的数据,此时堆的左、右子树还是堆的形式,我们便把堆的首位数向下调整,我们便可以得到第二位最大的数,我们再次首位的值交换,然后把第二位最大的数也排除堆的范围之内;循环往复。
时间复杂度:(一次建堆:1*LogN;选数:(N-1)*LogN)
(为什么不用小堆呢?小堆的话,只能选出最小的数,但如何选出次小的数呢?
如果我们取出最小的数,剩下的数可能是堆,也可能不是堆;若把剩下的数看成堆,那么关系全乱了(兄弟和叔侄之间没有大小关系),所以我们只能把剩下的数重新建堆,代价是:每建一次堆的时间复杂度为:O(LogN),这个方法不好)

时间复杂度:算的是量级,有时候时间复杂度是一样的,但是他们的效率是不一样的,在性能上是有差异的。

二、top k问题

top k问题:N个数里面找最大的前k个(N远大于k)
思路1:

N个数插入到大堆里面,Pop K次。
时间复杂度:一个数插入最多是高度次:LogN;N个数插入是:N*LogN次;取K个数是:K*LogN次,最终是O(N*LogN)。
思路2:

1、读取前K个值,建立k个数的小堆;
2、依次在读取后面的值,跟堆顶比较,如果比堆顶大,就替换堆顶的值,进堆,再向下调整。

2.1top k问题的代码实现:

//创造通过的随机数
void GreateNDate()
{//造数据int n = 10000000;srand(time(0));const char* file = "data.txt";//以写的形式将文件打开FILE* fin = fopen(file, "w");//fin:写  fout:读if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; i++){//我们产生一千万个数,直接用rand()是不行的//因为库里面的随机数最多只能产生三万多个,所以会有997万个数是重复的;//我们给rand()+i会大大减小重复int x = (rand() + i) % 10000000;fprintf(fin, "%d\n", x);//写入文件中}fclose(fin);
}//找出top k中最大的前k个数据
void PrintTopK(const char* file, int k)
{//以读的形式将文件打开FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}//建一个k个数的小堆int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}//读取前k个,建小堆for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);AdjustUp(minheap, i);}int x = 0;//把文件中的数据读取出来到x中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");fclose(fout);
}int main()
{//GreateNDate();PrintTopK("data.txt", 3);return 0;
}

 2.2如何保证取出的前k个数就是N个数里面最小的前k个数呢?

我们把随机数都取模1000万,那么随机数都是1000万以内的值;我们挑10个随机位置,该它们的值,让他们的值都大于1000万;那也就意味着随便改这10个位置,都能够把它们的值取出来,就说明取出的是前k个值是最大的,如果取不出来,那就是有问题的。

2.3实际数据测试展示:

三、时间复杂度

时间复杂度:算的是量级,有时候时间复杂度是一样的,但是他们的效率是不一样的,在性能上是有差异的。


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

Python+Django+Mysql+SimpleUI搭建后端用户管理系统(非常详细,每一步都清晰,列举了里面所有使用的方法属性)

一、在Anaconda环境下创建虚拟环境 &#xff08;1&#xff09;打开Anaconda Prompt(install)&#xff0c;创建虚拟环境&#xff0c;如下图所示&#xff1a; 方法一&#xff1a;默认情况下虚拟环境创建在Anaconda安装目录下的envs文件夹中 conda create --name usermanage …

高频面试题:合并两个List并去重

欢迎关注微信公众号&#xff1a;互联网全栈架构 合并两个List中并去掉重复的元素&#xff0c;有好几种方法&#xff0c;我们来看看常见的三种&#xff1a; 一、使用HashSet HashSet是一个没有重复元素的集合&#xff0c;可以利用这个特性&#xff0c;把List中的元素逐一添加到H…

简单几步制作翻页电子画册

翻页电子画册是一种非常流行的电子书形式&#xff0c;它能够以生动、美观、有趣的方式展示您的内容。如果您想要制作自己的翻页电子画册&#xff0c;以下是一些简单的步骤&#xff0c;可以帮助您轻松上手。 首先&#xff0c;你需要一款在线制作电子杂志平台。比如FLBOOK&#x…

java8开发常用的日期操作,纯干货分享

首先介绍java8关于日期和时间比较常用的一些类&#xff1a; Java 8 推出了全新的日期时间API&#xff0c;在教程中我们将通过一些简单的实例来学习如何使用新API。 Java处理日期、日历和时间的方式一直为社区所诟病&#xff0c;将 java.util.Date设定为可变类型&#xff0c;以…

5G阅信助力互联网行业:XX出行-出票通知,案例分析

XX出行日常有大量业务通知短信下发&#xff0c;用户触达频次和用户打开率都比较高&#xff0c;但原短信无法带来附加营销增值&#xff0c;通过阅信增值服务消息将两者结合起来&#xff0c;可实现业务的多渠道引流&#xff0c;开拓了新的渠道和方式。 项目概述&#xff1a; 1. 项…

WAZUH的安装、设置代理

wazuh安装 wazu的安装分为以下两种方式 官方文档&#xff1a;https://wazuh.com/blog/detecting-common-linux-persistence-techniques-with-wazuh/ 1、自定义安装 这种方式就是一步一步的安装 直接参考官方文档&#xff1a; 这里就不详细介绍了 2、直接下载打包好的虚拟机…

vscode调用HTML文件

vscode实现对HTML文件调用 创建html文件下载拓展内容点击拓展查找需要的拓展 导入html代码设置默认打开浏览器运行结果参考文献 做数据库课设的内容,尝试一些自己没有接触过的东西,了解如何创建一个网站以及数据库的一个应用 创建html文件 创建一个html的文件,加入后缀名 下…

从仿写持久层框架到MyBatis核心源码阅读

接上篇手写持久层框架&#xff1a;https://blog.csdn.net/liwenyang1992/article/details/134884703 MyBatis源码 MyBatis架构原理&主要组件 MyBatis架构设计 MyBatis架构四层作用是什么呢&#xff1f; API接口层&#xff1a;提供API&#xff0c;增加、删除、修改、查询…

『番外篇八』SwiftUI 脑洞大开实现“另类”视图跟随方法

概览 在 SwiftUI 的开发中,我们时常需要用指尖丝滑般地操作指定视图:比如,我们需要在拖动视图后让它自动归位,或者拖动一个视图时让另一个视图跟随它移动。 我们随后将会详细讨论上述两个 SwiftUI 中与视图移动相关场景的实现。 在本篇博文中,您将学到如下内容: 概览1.…

matlab导出高清图片,须经修改后放入latex(例如添加文字说明,matlab画图不易操作)

一、背景 我们在写文章时&#xff0c;使用matlab画图后&#xff0c;如果不需要对图片进行额外修改或调整&#xff0c;例如添加文字说明&#xff0c;即可直接从matlab导出eps格式图片&#xff0c;然后插入到latex使用。 通常latex添加图片&#xff0c;是需要eps格式的。 但很…

大数据爱好者福音:Kudu框架学习网站,助你一臂之力!

介绍&#xff1a;Kudu是由Cloudera开源的列式存储引擎&#xff0c;专为处理大数据而设计。它是为了解决Hadoop生态系统中的一些挑战而被引入的&#xff0c;如流式实时计算结果的更新和时间序列相关应用等需求。 Kudu具有几个显著的特点&#xff1a;首先&#xff0c;它是用C语言…

【Vue2+3入门到实战】(15)VUE路由入门声明式导航的基本使用与详细代码示例

目录 一、声明式导航-导航链接1.需求2.解决方案3.通过router-link自带的两个样式进行高亮4.总结 二、声明式导航-两个类名1.router-link-active2.router-link-exact-active3.在地址栏中输入二级路由查看类名的添加4.总结 三、声明式导航-自定义类名&#xff08;了解&#xff09…