![2692a4d76bea8184d6384dd07ea7e8fb.gif](https://i-blog.csdnimg.cn/blog_migrate/4cc2a3865fa3790a402fbd3a79309d98.gif)
「今天是学习C语言第 142 天」
纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」# 基本思想
外部排序是针对文件数据进行排序,当数据记录非常大时,例如10G大小的数据,远远大于内存容量,无法整个加载到内存中直接使用内部排序,因此需要使用外部排序进行排序。
外部排序典型的算法是归并排序,基本原理和前面文章的内部归并排序类似,区别是外部归并排序涉及文件的读写操作,需要首先将初始保存数据的大文件分为多个初始归并段,这些归并段足够小,可以通过加载到内存进行内部排序得到。最终将这些归并段进行归并,得到一个有序的完整文件。
备注:外部排序对于C语言初学者只需要掌握基本概念即可,了解大数据量文件化整为零进行排序的基本思想。
# K-路归并排序
对初始归并段可以采用两两归并、三三归并等,这些可以称为2-路归并、3-路归并、4-路归并。
以两两归并为例,2-路归并排序的过程,可以描述如下:
1.给定10G大小的无序整型数据文件data.txt,计算机内存大小2G, 需要进行数据排序。
2.可以将10G大小的数据文件分为10个1G大小的数据,分10次加载到内存。
3.每次对加载到内存的1G大小的数据,选择合适的一种内部排序算法进行排序,排序完成以后保存到单独的一个子文件中,可以形成data1.txt,data2.txt...,data10.txt 10个1G大小的数据子文件,每个子文件可以称为有序的归并段。
4.使用2路归并排序,每次打开两个文件,不能一次性读入,逐个读取对应文件的数据,比较以后,逐个输出到新的有序子文件中。这样10个1G的有序子文件,最终形成5个2G大小的有序子文件。
5.同样的过程,继续,最终形成1个10G大小的有序子文件。
# 算法分析
1.外部排序算法时间主要是花费在硬盘读取上,硬盘速度比内存速度低数量级,因此可以使用多路归并排序,减少硬盘读取次数优化性能。
2.外部归并排序算法与内部归并排序算法相比,主要涉及文件读写操作,初学者只需要掌握基本原理和概念就行,在遇到大数据量排序时,可以化整为零,切分数据逐步进行排序。
3.外部归并排序算法有很多更加高级复杂的算法,例如多路平衡归并排序(胜者树、败者树)算法,这些需要在深入学习数据结构专业课程后方能理解掌握。
---------- End ----------
往期精彩推荐:
一万分钟C语言学习计划:2020开篇
C语言内存管理的两种方式
C89标准库功能简介
C语言链接与存储类型
C语言标准输入输出
C语言入门基本语法
更多请点击公众号历史文章...
「喜欢C请赏个 赞 点击右下角 在看」