排序算法选型决策树
资料:https://pan.quark.cn/s/43d906ddfa1b、https://pan.quark.cn/s/90ad8fba8347、https://pan.quark.cn/s/d9d72152d3cf
根据数据规模 、稳定性要求 、数据类型 、内存限制四大核心条件,快速匹配最优排序算法,步骤如下:
开始
│
├─ 判断:数据量是否超过内存容量?
│ ├─ 是 → 外部排序(多路归并)
│ └─ 否 → 进入内部排序选择
│
├─ 内部排序选择:判断数据规模
│ ├─ 小规模数据(n < 1000)
│ │ ├─ 判断:数据是否部分有序?
│ │ │ ├─ 是 → 插入排序(效率最高)
│ │ │ └─ 否 → 冒泡排序(教学)/ 选择排序(交换成本低)
│ │ └─ 附加条件:需稳定性 → 冒泡/插入排序;无需稳定性 → 选择排序
│ │
│ ├─ 大规模数据(n ≥ 1000)
│ │ ├─ 判断:数据类型是否为整数/可数位拆分的字符串?
│ │ │ ├─ 是 → 进入非比较排序选择
│ │ │ │ ├─ 判断:值域范围k是否很小(k ≈ n)?
│ │ │ │ │ ├─ 是 → 计数排序
│ │ │ │ │ └─ 否 → 判断:位数d是否固定且较少?
│ │ │ │ │ ├─ 是 → 基数排序(大整数/手机号)
│ │ │ │ │ └─ 否 → 桶排序(均匀分布数据)
│ │ │ │
│ │ │ └─ 否 → 进入比较排序选择
│ │ │ ├─ 判断:是否要求稳定排序?
│ │ │ │ ├─ 是 → 归并排序
│ │ │ │ └─ 否 → 判断:内存是否极度受限?
│ │ │ │ ├─ 是 → 堆排序(原地O(1)空间)
│ │ │ │ └─ 否 → 快速排序(实际效率最高)
│ │ │
│ │ └─ 附加场景:需动态找Top K → 堆排序(无需全排序)
│
└─ 特殊场景补充
├─ 浮点数排序 → 桶排序
├─ 分布式大数据排序 → 分布式外部排序(MapReduce/Spark)
└─ 字符串字典序排序 → MSD基数排序
决策树使用示例
- 示例1 :给100名学生的考试成绩(0~100)排序 → 数据量小+整数+值域k=101 → 计数排序
- 示例2 :给100万条订单数据(含金额、时间)排序,要求时间相同的订单相对位置不变 → 大规模+需稳定 → 归并排序
- 示例3 :给TB级日志文件排序,内存仅8G → 超内存 → 外部排序(多路归并)
- 示例4 :嵌入式系统中给传感器采集的小数(0~1)排序,内存有限 → 小规模+浮点数 → 桶排序