堆排序的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问题+归并排序+六大排序总结 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • 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 条件认可 防止父亲在最后一层 魔法般的对应