
1) 【一句话结论】:采用归并排序(Merge Sort),它通过分治策略实现稳定排序,时间复杂度O(nlogn),空间复杂度O(n),适合大规模数据,且能保证相同成绩的学生顺序不变。
2) 【原理/概念讲解】:归并排序是典型的分治算法,核心思想是将待排序数组不断拆分成更小的子数组,直到子数组长度为1(有序),然后合并这些有序子数组,得到最终有序序列。合并时,比较两个有序子数组的当前元素,选择较小的放入结果数组;若两个元素相等,优先放入左子数组的元素(因为左子数组是之前排序的左半部分,顺序不变),这样保证了排序的稳定性。比如,合并[85, 92]和[85, 78],合并后是[85, 85, 78, 92],其中两个85的顺序与原左子数组一致,保持稳定性。
3) 【对比与适用场景】:
| 排序算法 | 定义 | 时间复杂度 | 稳定性 | 使用场景 | 注意点 |
|---|---|---|---|---|---|
| 归并排序 | 分治法,拆分-合并 | O(nlogn)(所有情况) | 稳定 | 大规模数据,需要稳定排序 | 需要额外O(n)空间 |
| 快速排序 | 分治法,基于分区 | O(nlogn)(平均),O(n²)(最坏) | 不稳定 | 大规模数据,通常更快 | 最坏情况不稳定 |
| 堆排序 | 堆数据结构,选择排序 | O(nlogn) | 不稳定 | 大规模数据,原地排序 | 不稳定,时间复杂度稳定 |
4) 【示例】:
假设学生数据结构为 Student,包含 id(唯一标识)和 score(成绩),待排序数组 students = [{id:1,score:85}, {id:2,score:92}, {id:3,score:85}, {id:4,score:78}]。
score,若相等则优先放左子数组的元素(如 id=1 的85在 id=3 之前),最终排序结果为 [ {id:1,score:85}, {id:2,score:92}, {id:3,score:85}, {id:4,score:78} ](按score升序,相同score保持原顺序)。5) 【面试口播版答案】:
“需要稳定排序且处理大规模数据,我会选择归并排序。归并排序通过分治策略,将数组拆分成更小的子数组,分别排序后合并,合并时若元素相等,优先放左子数组的元素(保证原顺序),实现稳定排序。时间复杂度是O(nlogn),适合百万级数据,空间复杂度O(n),能高效处理大规模数据,满足相同成绩顺序不变的要求。”
6) 【追问清单】:
7) 【常见坑/雷区】: