为何两种按字符数排序字符串数组的方法测试表现不同?
两种数组排序实现的差异及问题原因
你的代码和Array.sort()的实现主要有两个核心差异,也是导致测试不通过的关键原因:
1. 变量未声明导致的执行错误
你的排序代码中,temp变量没有使用var/let/const声明:
temp = ordering[i]; ordering[i] = ordering[j]; ordering[j] = temp;
如果测试环境启用了严格模式("use strict"),这种未声明变量的赋值会直接抛出ReferenceError,导致代码执行失败。而sort的实现没有这个问题,因此能正常运行。
2. 排序稳定性的差异
- 你的实现是选择排序,属于不稳定排序算法:当两个元素长度相同时,若后续操作涉及交换其他元素,可能会破坏原数组中相同长度元素的相对位置。比如原数组为
["b", "a", "z"](三者长度均为1),若插入一个长度为0的元素"",你的代码会将""交换到首位,最终得到["", "a", "z", "b"]——原数组中b在a前面,排序后相对顺序被反转。 - 现代浏览器(包括Edge)中的
Array.sort()采用稳定排序算法(如Timsort或插入排序):当比较函数返回0时(即两个元素长度相等),会严格保留它们在原数组中的相对顺序。如果测试用例要求必须保持相同长度元素的原顺序,你的选择排序就不符合要求,而sort的实现则能满足。
内容的提问来源于stack exchange,提问作者Wattakka
相关产品推荐
相关产品推荐

