作者 | 帅地

责编 |胡巍巍

西天取经的路上,一样上演着编程的乐趣.....

排序的时候我们可以选择快速排序或归并排序等算法。

为了方便,我们把排序好的2G有序数据称之为有序子串吧。接着我们可以把两个小的有序子串合并成一个大的有序子串。

(注意:读取的时候是每次读取一个int数,通过比较之后在输出。)

按照这个方法来回合并,总共经过三次合并之后就可以得到8G的有序子串。

接下来把12个数据分成4份,然后排序成有序子串。

然后把子串进行两两合并。

输出哪个元素,就在那个元素所在的有序子串再次读入一个元素。

继续。

重复直到合并成一个包含6个int的有序子串。

再把两个包含6个int的有序子串合并成一个包含12个int数据的最终有序子串。

优化策略

解释下:例如对于数据2,我们把无序的12个数据分成有序的4个子串需要读写各一次,把2份3个有序子串合并成6个有序子串读写各一次;把2份6个有序子串合并从12个有序子串读写各一次,一共需要读写各3次。

多路归并

为了方便讲解,我们假设内存一共可以装4个int型数据。

置换选择

例如我们可以从12个数据读取3个存到内存中,然后从内存中选出最小的那个数放进子串p1里;

之后再从在从剩余的9个数据读取一个放到内存中,然后再从内存中选出一个数放进子串p1里,这个数必须满足比p1中的其他数大,且在内存中尽量小。

这样一直重复,直到内存中的数都比p1中的数小,这时p1子串存放结束,继续来p2子串的存放。例如(这时假设内存只能存放3个int型数据):

12个无序的int数据:

读入3个到内存中,且选出一个最小的到子串p1:

从内存中再次读取一个元素86:

从内存中再次读取一个元素3:

从内存中再次读取一个元素24:

从内存中再次读取一个元素8:

这个时候,已经没有符合要求的数了,且内存已满,进而用p2子串来存放,以此类推。

通过这种方法,p1子串存放了4个数据,而原来的那种方法p1子串只能存放3个数据。

(不知道堆排序的可以看下我之前写的文章:【算法与数据结构】堆排序是什么鬼?)

从12个数据中读取3个数据,构建成一个最小,然后从堆顶选择一个数写入到p1中。

之后再从剩余的9个数中读取一个数,如果这个数比刚才那个写入到p1中的数大,则把这个数插入到最小堆中,重新调整最小堆结构,然后在堆顶选一个数写入到p1中。

否则,把这个数暂放在一边,暂时不处理。之后一样需要调整堆结构,从堆顶选择一个数写入到p1中。

这里说明一下,那个被放在一边的数是不能再放入p1中的了,因为它一定比p1中的数都要小,所以它会放在下一个子串中

看这些文字会让人头大,我画图解释下吧。

从12数据读取3个数据:

构建最小堆,且选出目标数:

读入下一个数86:

读入下一个数3,比70小,暂放一边,不加入堆结构中:

读入下一个数据24,比81小,不加入堆结构:

读入下一个数据8,比86小,不加入堆结构。此时p1已经完成了,把那些刚才暂放一边的数重新构成一个堆,继续p2的存放。

以此类推...

最后生成的p2如下:

这种方法适合要排序的数据太多,以至于内存一次性装载不下。只能通过把数据分几次的方式来排序,我们也把这种方法称之为外部排序

作者:帅地

个人简介:一个热爱编程的在校生,我的世界不只有coding,还有writing。目前维护订阅号「苦逼的码农」,专注于写「算法与数据结构」,「Java」,「计算机网络」。

推荐阅读:

  • 如何避免面试现场被虐?

  • 5 万条微信语音升入太空;阿里京东否认停止社招;雷军开怼华为 | 极客头条

  • 干货 | 18个Python爬虫实战案例(已开源)

  • 区块链与你“最熟悉的陌生人”

  • 程序员的江湖 务必掌握这些黑话!

  • CSDN蒋涛提出技术社区三倍速定律,称下一个20年全球开发者数量将过亿

  • 那些一毕业就选择华为的人,后来都怎么样了

漫画:什么是外部排序?相关推荐

  1. 漫画: 什么是外部排序?

    西天取经的路上,一样上演着编程的乐趣..... 排序的时候我们可以选择快速排序或归并排序等算法. 为了方便,我们把排序好的2G有序数据称之为有序子串吧.接着我们可以把两个小的有序子串合并成一个大的有序 ...

  2. 外部排序归并排序 败者树

    一.定义问题 外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的.外部排序最常用的算法是多路 ...

  3. sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID...

    转自:http://github.tiankonguse.com/blog/2014/12/03/sphinx-token-inverted-sort.html 外部排序 现在我们的背景是有16个已经 ...

  4. mysql外部排序_深入浅出MySQL优先队列(你一定会踩到的order by limit 问题)

    0.先抛问题 假设字段category无索引且有重复值,order by category 和 limit 组合使用的结果会和预期不符. 问题复现: 表结构(就是两个字段) CREATE TABLE  ...

  5. 数据结构之外部排序:最佳归并树

    外部排序:最佳归并树 思维导图: 归并树的定义: 例: 最佳归并树(本质是一颗哈夫曼树): 所有的初始归并段一定能构造出一颗完美的哈夫曼树吗? 怎么选择补充虚短的个数? 思维导图: 归并树的定义: 例 ...

  6. 数据结构之外部排序:置换-选择排序

    外部排序:置换-选择排序 置换-选择排序算法思想: 步骤: 通过减少归并段r来减少IO次数 置换-选择排序算法思想: minimax就是FO中的最后一个数据元素的大小 1.将工作区填满 2.从工作区选 ...

  7. 数据结构之外部排序:失败树

    外部排序:失败树 S趟归并总共需要比较的次数1: 失败树的定义: S趟归并总共需要比较的次数2: 总结: 通过失败树来增加归并排序路数从而减少io读写次数 S趟归并总共需要比较的次数1: S是趟数,n ...

  8. 数据结构之外部排序:归并排序法

    外部排序:归并排序法 思维导图: 外部归并排序的原理: 外部归并排序的性能: 归并排序法的优化: 思维导图: 外部归并排序的原理: 第一步: 第二步: 问题:内存缓存区大小固定,外存数据元素分块后仍然 ...

  9. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等
  2. Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?
  3. 【重磅】谷歌2021博士奖研金完整名单出炉,13个方向共75人获奖
  4. Android内核开发:源码的版本与分支详解
  5. webpack配置alias别名设置
  6. mysql 数据库 导入兼容_mysql数据库的导入和导出
  7. Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服务-Eclipse和Maven项目
  8. php查找空白行,如何从PHP文本中删除空白行?
  9. 【kafka】Kafka管理与监控
  10. APICloud App定制平台的操作指南
  11. 金三银四,冰河为你整理了这份20万字134页的面试圣经!!
  12. 车辆路径问题(VRP)初探
  13. FPGA(二)---38译码器
  14. java优先级 六级和七级_百度知道六级和七级得区别是什么?如何升到七级?
  15. keil安装stm32系列
  16. oracle-j2sdk1.8,cloudera-manager – 没有包oracle-j2sdk1.7可用?
  17. Python调整图片的文件大小
  18. kpi绩效考核流程图_绩效考核流程图
  19. 纯手工焊接七彩圣诞树
  20. 证券业上云内参: 深圳证券信息

热门文章

  1. leetcode python3 简单题20. Valid Parentheses
  2. linux 混杂模式 收包,Linux下使用混杂模式抓包(2)
  3. Unity实现物体生命值跟踪的方法
  4. Flutter进阶—自定义主题风格
  5. 2021-2025年中国电子风扇速度控制器行业市场供需与战略研究报告
  6. IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词。终极解决办法!!!!
  7. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示
  8. eclipse如何修改字体大小
  9. 当开源奔向物流,阿里云 PolarDB-X 数据库与韵达携手的背后
  10. 从高量到高质,私域流量的变革与发展