
1) 【一句话结论】:对于1-5级的整数难度题目排序,最佳方法是计数排序,时间复杂度O(n+k),空间O(k),适合小范围整数排序,百万级题目时仍高效(k为难度级别数,此处k=5)。
2) 【原理/概念讲解】:计数排序的核心是将整数难度作为索引,统计每个难度出现的次数。具体步骤:
count[0..5]),初始化为0;count[题目难度]加1(统计频次);3) 【对比与适用场景】:
| 算法 | 时间复杂度(最好/平均/最坏) | 空间复杂度 | 适用场景 | 是否稳定 |
|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 小规模数据 | 是 |
| 快速排序 | O(nlogn) | O(logn) | 大规模数据,一般用途 | 否(原版) |
| 计数排序 | O(n+k) | O(k) | 难度范围小(如1-5)的整数排序 | 是 |
| 基数排序 | O(d(n+k)) | O(n+k) | 非负整数,位数固定 | 是 |
(注:k为难度级别数,此处k=5,d为位数,d=1)
4) 【示例】:伪代码示例
function sortQuestions(questions):
maxDiff = 5 // 假设难度最大为5
count = array of size (maxDiff+1) filled with 0
for each q in questions:
count[q.difficulty] += 1 // 统计每个难度频次
// 前缀和累加,确定边界
for i from 1 to maxDiff:
count[i] += count[i-1]
// 从后往前遍历,保证稳定
result = array of size len(questions)
for i from len(questions)-1 down to 0:
diff = questions[i].difficulty
result[count[diff] - 1] = questions[i]
count[diff] -= 1
return result
5) 【面试口播版答案】:
面试官您好,对于学而思竞赛题库按难度(1-5级整数)排序,我建议采用计数排序。因为难度是固定的小范围整数,计数排序的时间复杂度是O(n+k),这里k是难度级别数(5),空间复杂度O(k),非常高效。具体来说,先统计每个难度出现的次数,然后通过前缀和确定每个难度的边界位置,最后从后往前放置题目,保证排序稳定。对于百万级题目,计数排序的线性时间复杂度比快速排序的O(nlogn)更优,空间开销(k=5)也极小,所以能高效处理大数据量。
6) 【追问清单】:
7) 【常见坑/雷区】: