在输入接近排序时,利用插入排序的快速运行时间,可以在实践中提高快速排序的运行时间。 当在具有少于k个元素的子数组上调用quicksort时,让它只返回而不对子数组进行排序。在对quicksort返回顶级调用之后,对整个数组运行插入排序以完成排序过程。
认为此排序算法在O(nk + n log(n / k))预期时间内运行。在理论上和实践中应该如何挑选k?
答案 0 :(得分:3)
粗略地说:
快速排序是O(N log(N))
当子列表长度为k时停止,快速排序部分变为O(N log(N/K))
,因为您必须去的深度减少了K倍。
插入排序通常为O(n^2)
,因为您平均每次移动最多n / 2次,并忽略1/2因子。
由于插入排序现在位于固定长度数组上,因此您只能在最多k个位置移动每个元素。这会导致您的操作的插入排序部分为O(NK)
。
理论上,较大的K值会给出更快的排序,但这取决于排序的项目数量很大。在实践中,k的最佳值将取决于n的值,并且可以通过将k作为常数区分k来找到。
如果德兰建议这是一个家庭作业问题,这个答案可能需要一些充实和正式的证据。