对于合并排序和快速排序,我试图想出最糟糕的情况。如果我是正确的,当所有东西都排序后,合并排序的最坏情况O(nlogn)。快速排序最糟糕的情况是当数据透视表处于最不理想的位置,并且数组被排序,所以它变成了O(n^2)。我想知道这是否是正确的,所以如果不是,请纠正。 我真正的问题是如果快速排序的枢轴位于数组的中间,那么数组必须看起来像是为了O(n^2)?了解合并排序和快速排序的运行时间
2
A
回答
1
快速排序最糟糕的情况是当数据透视小于或大于其他所有剩下要排序的值时。在这种情况下,每个递归级别的剩余值中只有1个项目被删除,时间复杂度最终为O(n^2)。
对于基本的合并排序,自上而下或自下而上,移动次数总是相同。比较的数量取决于数据模式。当合并两次大小为n的游程时,最差情况下的比较次数为2n-1(当比较两次运行中的每个元素时,只剩下1个元素,没有任何可比较的,因此它只是被复制)最好的情况是,一次运行的所有元素都小于另一次运行的第一个元素,在这种情况下,比较次数为n,例如数据已经排序或反向排序。
0
您可以模拟快速排序,确保每次选择枢轴时,它都是连续0,1,2,...以确保最差情况下的性能。
这里假设一个通常的旋转算法,在将数组分区之前,将pivot数值交换到数组的起始位置。在这种情况下,由于我们选择的枢轴是最小的剩余物品,因此不会进行分区。
这里的仿真代码:
class Cell:
def set(self, v):
self.v = v
def worst_case_quicksort(xs, i):
xs = xs[:]
for i in xrange(len(xs)):
p = (len(xs) - i) // 2
xs[i+p].set(i)
xs[i], xs[i+p] = xs[i+p], xs[i]
xs = [Cell() for _ in xrange(20)]
worst_case_quicksort(xs, 0)
print [x.v for x in xs]
输出看起来像这样:
[1, 11, 3, 19, 5, 13, 7, 17, 9, 15, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
相关问题
- 1. 运行合并排序和快速排序的线性时间
- 2. Bubble排序和快速排序的运行时间比较
- 3. C++快速排序运行时间
- 4. 合并中的递归排序,快速排序和树遍历
- 5. 并行快速排序由单线程快速排序
- 6. 合并排序运行时间
- 7. 与合并排序相比,修改的合并排序的运行时间?
- 8. 需要了解此快速排序
- 9. 快速排序的解释
- 10. 快速排序不排序
- 11. 模板化快速/合并排序
- 12. 多线程快速排序或合并排序
- 13. 外部排序与k路合并与快速排序
- 14. 并发快速排序
- 15. 证明修改后快速排序的运行时间= O(Nk)
- 16. 合并排序算法的最佳运行时间和平均运行时间
- 17. Firebase:结合过滤和快速排序
- 18. 合并排序合并运行时间anaylsis
- 19. 快速排序在O(n^2)时间内运行?
- 20. 快速排序中位数3运行时间
- 21. 并行快速排序C实现
- 22. 的快速排序
- 23. 的快速排序
- 24. 在选择排序,插入排序,合并排序和快速排序中计数比较?
- 25. 归并和快速排序用C
- 26. 快速排序在排序列表上花费更长时间
- 27. 快速搜索和排序
- 28. 最大和快速排序
- 29. (C++)合并排序执行时间
- 30. 对它的排序 - 快速排序
因此,如果枢轴为5中的阵列[1,2,3,4,5,6 ,7,8,9],因为它在中间,所以运行时间是O(n log n),因为5既不大于也不小于数组中的所有其他值?此外,如果枢轴仍然是5,并且该数组类似于[7,8,9,10,5,11,12,13,14],由于枢轴小于所有其他值,这会是O(n^2)时间复杂度的一个例子? – Dinoman979
@ Dinoman979 - 是的,但是对于O(n^2)时间复杂度,代码将不得不重复遇到中间点小于或大于其余值的情况。如果代码选择中间值,则模式将变得复杂,并且将取决于数据透视是否包含在通过递归调用传递的子数组中。 – rcgldr