堆排序的topk问题+归并排序+六大排序总结

2023-11-20

回忆一下堆排序:

 

思路:

sift函数:调整,将父亲和孩子(左孩子和右孩子中最大的那个数) 然后和父亲比较,如果孩子大就将孩子的位子变为下一个父亲,往下拉 并且将孩子的值赋给他的父亲;j<=high 条件认可:

防止父亲在最后一层,魔法般的对应父亲大于孩子的情况,如果父亲大于孩子就将父亲的值写到父亲的位置上去,这和父亲落到最后位置的情况处理方式一样,十分巧妙。

建堆:农村包围城市,从最后一个堆开始调整 直到整个堆,调整为一个大根堆或是一个小根堆。

挨个出数:从最后一个数开始,循环处理,与第一个数(堆顶这个数是最大或者最小的数)交换,再次调成大根堆或者小根堆,注意第一次调整是high的值应该指向n-2的位置。利用循环,每次出来交换数,调整,直到将列表有序化。

言归正传:
堆排序应用之Topk问题:
现在有n个无序的数,设计算法得到前k个大的数(k<n)

例如:微博热门评论排行,网站排名......

解决思路: # k为常数

  • 排序后切片 O(nlogk)
  • 排序lowbi三人组(冒泡,选择,插入) O(kn)
  • 堆排序思路 O(nlogk)

所以我们在这里需要使用堆排序的降序调整:
如何修改升序?就改两个地方,如图:

Topk函数实现:

总结:


切片前k个数;

 

遍历k个数后面的数,选出大于堆顶的数据+每次都调整让对应堆顶始终是最小的数。

挨个出这k个数,与堆排序一样 注意:这里处理的列表是包含这k个数的并不是原列表!

 

 有想法的小伙伴可以在留言区下,说说你的思路,包括上面提及到的lowbi三人组,切片排序/..

归并排序

设计到递归,与快数排序一样,不是很好理解,但是好写一点。

原理:
n个数先拆到最后每个数都是单个数,递归到最大限度(low<high) 开始使用归并merge()

一层一层排序,直到最后一层排序就结束, 如图:

 

 核心merge函数实现:

 

 

 真正的归并排序实现:

 

 

 空间复杂度:
空间复杂度是:O(n)因为开辟了一个new_list列表来存储数据,所以就这样了。。

时间复杂度:
按照层数对应 每次归并排序(一次归并排序的时间复杂度是O(n))

所以,归并排序整体的时间复杂度是O(nlogn)

排序总结:

 快速归并堆排序的执行时间比较:

 

什么叫稳定性:
简单而言,就是说排序时,数是一个一个比较的,而不是一片一片扫描。

可以看出:冒泡、插入、归并排序稳定! 

显然,快速排序最快,但是也有最坏的情况,我们可以生成随机下标与第一个数进行交换,降低这种最坏的风险,降低这种概率。

综上所述,这就是本篇文章的所有内容,谢谢大家的观看,感谢!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆排序的topk问题+归并排序+六大排序总结 的相关文章

  • Python 3.0 使用turtle.onclick

    所以这是我的问题 我必须为我的计算机科学课程制作一张图片 而在海龟中进行估计确实令人沮丧 我计划使用 onclick 来显示我的位置 import turtle as t def getPos x y print x y return de
  • 删除 python vaex 中的重复行

    我正在使用 python vaex 但我不知道如何删除数据框中的重复行 例如 在 pandas 中存在以下方法drop duplicates vaex中有没有类似的功能 似乎还没有 但我们应该在某个时候期待这个功能 其间 有vaex创始人的
  • 在 Chaquopy 中转换数组和张量

    我该怎么做呢 我看到你的帖子说你可以将 java 对象传递给 Python 方法 但这不适用于 numpy 数组和 TensorFlow 张量 以下以及其各种变体是我尝试过的 但没有成功 double anchors new double
  • Windows 中的信号处理

    在Windows中 我试图创建一个等待SIGINT信号的python进程 当它收到SIGINT时 我希望它只打印一条消息并等待SIGINT的另一次出现 所以我使用了信号处理程序 这是我的 signal receiver py 代码 impo
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • 解析器生成

    我正在做一个项目软件抄袭检测 我打算用C语言来做这件事 因为我应该创建一个令牌生成器和一个解析器 但我不知道从哪里开始 任何人都可以帮助我解决这个问题 我创建了一个令牌数据库 并将令牌与我的程序分开 接下来我想做的就是比较两个程序以查明它是
  • 为什么 1.__add__(2) 不起作用? [复制]

    这个问题已经存在了 可能的重复 访问 python int 文字方法 https stackoverflow com questions 10955703 accessing a python int literals methods 在P
  • Seaborn 条形图条之间没有空格

    我使用下面的代码创建了一个 Seaborn 条形图 它来自https www machinelearningplus com plots top 50 matplotlib visualizations the master plots p
  • 使用 Python gdata 和 oAuth 2 对日历进行身份验证

    我正在将一个 Python 应用程序从 oAuth 1 迁移到 oAuth 2 该应用程序读取用户的 Google 日历提要 使用 oAuth 1 如果用户可以使用他的 GMail 进行身份验证 我的应用程序将打开浏览器 帐户并授权访问 我
  • 如何检查两个数据集的匹配列之间的相关性?

    如果我们有数据集 import pandas as pd a pd DataFrame A 34 12 78 84 26 B 54 87 35 25 82 C 56 78 0 14 13 D 0 23 72 56 14 E 78 12 31
  • 解释 scipy.stats.entropy 值

    我正在尝试使用scipy stats 熵来估计库尔巴克 莱布勒 KL 两个分布之间的散度 更具体地说 我想使用 KL 作为衡量标准来确定两个分布的一致性 但是 我无法解释 KL 值 例如 t1 numpy random normal 2 5
  • 在Python中使用Counter()来构建直方图?

    我在另一个问题上看到我可以使用Counter 计算一组字符串中出现的次数 所以如果我有 A B A C A A I get Counter A 3 B 1 C 1 但现在 我如何使用该信息来构建直方图 对于您的数据 最好使用条形图而不是直方
  • 在 Mac OS x 10.7.5 中运行 Scrapy 所需的文件,使用 Python 2.7.3 IEPD_free(32 位)

    我是第一次测试 scrapy 使用命令安装后 sudo easy install U scrapy 一切似乎都运行正常 但是 当我运行时 scrapy startproject tutorial 我得到以下信息 luismacbookpro
  • Django ConnectionAbortedError:[WinError 10053]已建立的连接被主机中的软件中止

    我将 django 与 postgresql 一起使用 每当我尝试保存或删除任何内容时 都会发生此错误 Traceback most recent call last File c program files x86 python35 32
  • 如何使用 Misc.imread 将图像分割为红色、绿色和蓝色通道

    我正在尝试将图像切片为 RGB 但在绘制这些图像时遇到问题 我使用此函数从某个文件夹获取所有图像 def get images path image type image list for filename in glob glob pat
  • 按工作日分组的熊猫 (M/T/W/T/F/S/S)

    我有一个 pandas 数据框 其中包含 YYYY MM DD arrival date 形式的时间序列 作为索引 我想按每个工作日 周一到周日 进行分组 以便计算其他日期列是平均值 中位数 标准差等 我最终应该只有七行 到目前为止我只知道
  • Python 中的数据可用性图表

    我想知道Python是否有一些东西可以绘制具有多个变量的时间序列的数据可用性 下面显示了一个示例 取自Visavail js 时间数据可用性图表 https github com flrs visavail 1 description 以下
  • Python:ConfigParser.NoSectionError:没有部分:“TestInformation”

    我使用上面的代码收到 ConfigParser NoSectionError No section TestInformation 错误 def LoadTestInformation self config ConfigParser Co
  • 在Python中:检查文件修改时间是否早于特定日期时间

    我用 C 编写了以下代码来检查文件是否已过期 DateTime lastTimeModified file getLastTimeModified if lastTimeModified HasValue File does not exi
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or

随机推荐

  • Leetcode刷题日志5.0

    目录 前言 1 两数相加 2 无重复字符的最长子串 3 整数反转 4 删除链表的倒数第 N 个结点 前言 今天我又来继续分享最近做的题了 现在开始进入我们快乐的刷题时间吧 编程语言Python3 0 难度 中等 1 两数相加 给你两个 非空
  • Redis工具类(缓存操作,Object转换成JSON数据)

    依赖spring data redis 2 4 1 jar Component Data public class RedisUtils Autowired private RedisTemplate
  • 双向链表详解

    目录 一 双向链表的概念及结构 二 双向链表的方法及其实现 2 1 双向链表 2 2 addFirst int data 头插法 2 3 addLast int data 尾插法 2 4 size 链表长度 2 5 display 打印链表
  • Centos6.4 用rpm方式安装MySql5.6

    1 查看系统是否安装了MySQL 使用命令 rpm qa grep mysql 2 卸载已安装的MySQL 卸载mysql命令如下 rpm e nodeps mysql libs 5 1 61 4 el6 x86 64 要将 var lib
  • sql局部变量和全局变量_有效使用SQL内置全局变量

    SQL内置全局变量是只读的 由IBM DB2 for i维护 并且是受信任且易于使用的资源 存在一些全局变量是为了与DB2系列兼容 并且包含在SYSIBM模式中 其他全局变量提供IBM i特定的值 并包含在QSYS2模式中 全局变量使应用程
  • 【实验二】【创建表并输入数据】

    文章目录 目的表 XSQK 学生情况 KC 课程 XS KC 学生 课程 T SQL创建表 1 新建查询 2 切换数据库 3 输入T SQL查询语句创建表 XSQK 学生情况 KC 课程 XS KC 学生 课程 4 执行命令 5 查看表 S
  • JVM笔记5:虚拟机栈

    目录 1 虚拟机主要特点 虚拟机栈出现的背景 初步印象 内存中的栈与堆 虚拟机栈基本内容 2 虚拟机栈的常见异常与如何设置栈大小 3 栈的存储结构和运行原理 栈中存储什么 栈运行原理 4 栈帧的内部结构 每个栈帧中存储着 5 局部变量表 6
  • 基于python的全球疫情数据分析及可视化系统

    源码获取 https www bilibili com video BV1Ne4y1g7dC 现如今 随着互联网的发展 人们获取信息的方式也各有不同 以前的传统方式的信息流与电视 报纸 书籍 信件 等等 因为互联网的使用 现在的互联网媒体已
  • C++ 判断文件是否被打开,防止重复打开

    如何判断文件是否已经被打开 在这里通过文件的一些属性实现判断文件是否被打开 通过QFile将文件尝试实现例如linux的move操作和rm r 的操作 就可以判断是否文件被占用 首先添加 include QFile 头文件 再设置全局的判断
  • 项目中:Json文件的读取

    项目中 Json文件的读取 读Json文件 取Json文件中内容 举例 举例 Json文件内容如下 Flickr8k images sentids 39300 39301 39302 39303 39304 imgid 7860 sente
  • C++11中 std::bind 的两种用法

    概述 std bind的头文件是
  • hadoop环境搭建之关闭防火墙和SELinux

    每一台服务器上都要做1 2 1 关闭防火墙 查看防火墙状态 systemctl status firewalld 关闭防火墙 systemctl disable firewalld systemctl stop firewalld 查看防火
  • iOS 获取系统键盘UIKeyboard方法

    公司项目需求 需要让弹窗显示在键盘所在的图层之上 而不是在弹窗出现的时候消失 如图1 系统弹窗出现的时候会使键盘暂时不显示 而这种效果显然不符合要求的 由于没想到更好的办法 只好从键盘自身的UIKeyboard做文章了 通过获取当前键盘的U
  • 【Java多线程批量数据导入的方法】

    前言 当遇到大量数据导入时 为了提高处理的速度 可以选择使用多线程来批量处理这些处理 常见的场景有 大文件导入数据库 这个文件不一定是标准的CSV可导入文件或者需要在内存中经过一定的处理 数据同步 从第三方接口拉取数据处理后写入自己的数据库
  • 按装完mysql怎么启动_mysql安装完怎么启动服务器?

    mysql安装完启动服务器的方法 1 打开 开始 菜单 依次点击 管理工具 服务 打开系统服务窗口 2 在 服务 窗口中找到 MySQL 右击选择 启动 命令就可以启动mysql服务器了 mysql 是世界流行的开源数据库系统 下面本篇文章
  • 关于TypeScript和React的使用

    TS和React的使用 接口与类型 type与interface 内置的语法糖 Partial和Required Readonly Omit Exclude 继承 接口与类型 type与interface 内置的语法糖 Partial和Re
  • ffmpeg错误码

    cpp view plain copy AVERROR BSF NOT FOUND 1179861752 AVERROR BUG 558323010 AVERROR DECODER NOT FOUND 1128613112 AVERROR
  • 数字化转型中的国产化替代之路

    引言 数字经济浪潮席卷全球 我国数字经济已进入快速发展阶段 加快推进企业数字化转型 已成为共识 同时有利于构建全产业链数字化生态 增强产业链上下游的自主可控能力 为数字经济社会发展 构建数智化生态注入新动能 在此过程中 国产软件企业作为数字
  • python利用tushare下载数据并计算当日收益率

    python利用tushare下载数据并计算当日收益率 计算股票收益率的程序主要有以下几部分构成 1 获取股票接口数据函数 pro daily stock 2 计算收益率函数 cal stock 里面有两种计算式 你可以根据自己字典写入建仓
  • 堆排序的topk问题+归并排序+六大排序总结

    回忆一下堆排序 思路 sift函数 调整 将父亲和孩子 左孩子和右孩子中最大的那个数 然后和父亲比较 如果孩子大就将孩子的位子变为下一个父亲 往下拉 并且将孩子的值赋给他的父亲 j lt high 条件认可 防止父亲在最后一层 魔法般的对应