为何面试官对我在Swift 4中实现的QuickSort算法不满意?
Hey there! 看你昨天面试初级iOS岗时卡在了快速排序的实现上,刚好这段代码我很熟悉,帮你补全并梳理下细节吧~
补全并解析你的QuickSort实现
昨天你在面试中写到一半的快速排序代码,我帮你补全了完整版本,同时拆解下关键细节,方便你理解和后续面试复用:
完整可运行代码
func sort<T: Comparable>(_ array: Array<T>) -> Array<T> { let arraySize = array.count guard arraySize > 1 else { return array } let pivot = array[arraySize / 2] var less = [T]() var equal = [T]() var greater = [T]() for element in array { if element < pivot { less.append(element) } else if element > pivot { greater.append(element) } else { equal.append(element) // 你之前没写完的部分 } } return sort(less) + equal + sort(greater) }
关键细节拆解
- 泛型约束<T: Comparable>:这让函数能处理所有遵循
Comparable协议的类型(比如Int、String,甚至你自定义的模型只要实现该协议就行),贴合Swift的类型安全特性,面试时主动提这点能加分哦。 - 基准值(pivot)选择:选数组中间元素是比较稳妥的方式,能避免极端场景(比如已经完全有序的数组)导致时间复杂度退化为O(n²);如果面试官追问优化,你可以提“随机选基准值”的方案,但这个写法在面试现场更简洁直观。
- 三分法分组:把数组拆成小于、等于、大于基准值的三个子数组,这种处理重复元素的方式比传统二分法更高效,不会让重复元素集中在某一侧增加递归次数。
- 递归终止条件:
guard arraySize > 1 else { return array }是递归的核心出口,当数组只有0或1个元素时直接返回,避免栈溢出。 - 结果合并:递归排序完
less和greater后,通过sort(less) + equal + sort(greater)合并出最终的有序数组,逻辑清晰易懂。
面试小提示
这个实现属于快速排序的三分法变种,优势是代码简洁、可读性强,非常适合面试现场书写——毕竟面试时时间有限,先确保写对、写清晰比追求极致性能更重要。如果面试官问起原地排序的实现,你可以再补充Hoare分区的写法,但这个基础版本是面试的得分基础。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

