408 数据结构|外部排序:流程与 k 路归并

对应章节:排序 → 外部排序

1. 什么是外部排序

当待排序数据太大,无法一次性全部放进内存时,就要使用外部排序。

核心流程:

复制代码
大文件
↓
分块读入内存
↓
每块内部排序
↓
形成多个有序的初始归并段
↓
多路归并
↓
得到最终有序文件

2. 生成初始归并段

假设内存一次能装下 L 个记录:

复制代码
读入 L 个记录
↓
在内存中排序
↓
写回外存
↓
形成一个有序归并段

重复后得到:

复制代码
r 个初始归并段

3. 什么是 k 路归并

k 路归并:

一次同时合并 k 个有序归并段。

内存中通常需要:

复制代码
k 个输入缓冲区
+
1 个输出缓冲区

4. k 路归并怎么做

复制代码
1. 从 k 个归并段各读一块到输入缓冲区
2. 比较 k 个当前候选记录
3. 选最小记录放入输出缓冲区
4. 某输入缓冲区用完,就继续读对应归并段
5. 输出缓冲区写满,就写回外存
6. 重复直到合并完成

5. 需要多少趟归并

初始有 r 个归并段,每次做 k 路归并:

复制代码
S = ceil(log_k r)

大白话:

复制代码
每做一趟
归并段数量大约缩小为原来的 1/k

例如:

复制代码
r=16,k=4

16 → 4 → 1

所以:

复制代码
S=2

6. 速记

复制代码
外部排序:
先分块排好
再多路合并

k路归并:
k个输入缓冲区
1个输出缓冲区

归并趟数:
S = ceil(log_k r)
相关推荐
信奥卷王1 小时前
2025年09月GESPC++五级真题解析(含视频)
算法
闻缺陷则喜何志丹1 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
leihefeng2 小时前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
全栈技术负责人2 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_32 小时前
面试题 02.07. 链表相交
算法·链表
residual_fan3 小时前
特征级SMOTE(Feature-level SMOTE)论文分享
人工智能·算法·数据挖掘·数据分析
xxwxx__3 小时前
深入理解 C++ STL:stack、queue 与 deque 从使用到底层实现全解析
开发语言·c++·算法
sylviiiiiia3 小时前
Leetcode hot100 多数元素/相交链表/反转链表
算法·leetcode·链表
CoderYanger3 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯