我在C中实现了一个quicksort实现,我试图弄清楚需要哪些输入才能导致更糟糕的案例性能。
根据wikipedia:
总是选择分区中的最后一个元素作为枢轴,这样会导致已经排序的列表或相同元素列表的性能不佳(n ^ 2)。
所以我尝试这样做,结果是the following code。 pivot始终是最后一个元素,输入是已排序的列表。
为了证明复杂性确实是n ^ 2,我创建了一个全局变量,我在每次迭代中递增,然后最终打印出来。
我预计程序会打印出来:
Done in 64 iterations
然而,它在28次迭代中完成了它。也许我对“复杂性”一词的理解是错误的?
答案 0 :(得分:5)
在每次迭代中,列表会缩小一个元素,因为枢轴已移动且不再计算。因此,迭代总量为7 + 6 + 5 + 4 + 3 + 2 + 1 = 28。
请注意,这仍然是二次方,因为它等于n*(n-1)/2
。
答案 1 :(得分:1)
对于n = 8,迭代次数为28。
迭代次数等于n*(n-1)/2
= 8 * 7/2 = 28.
现在函数是 f(n)= n *(n-1)/ 2 = n 2 / 2 - n / 2 。
f(n)= O(n 2 / 2 - n / 2)= O((1/2)n 2 )=为O(n 2 )即可。
因此,对于Quicksort来说,输入实际上是最糟糕的情况。