【发布时间】:2015-09-19 15:55:47
【问题描述】:
这是我的代码。我想知道如何计算这个非常具体的代码部分的时间复杂度。根据规则,我们需要计算第一个内部 2 while 循环,然后将它们相加,然后将它们与外部循环相乘,但我无法弄清楚如何计算它们然后得出答案。
int start=first,end=last;
int mid= (first+last)/2;
int temp;
while(start<=end)
{
while(a[start]<a[mid])
{
start=start+1;
}
while(a[end]>a[mid])
{
end=end-1;
}
if(start<=end)
{
temp=a[start];
a[start]=a[end];
a[end]=temp;
start++;
end--;
}
}
【问题讨论】:
-
那么到目前为止你有什么?
-
@Kenneyi 只知道以 o(n) 表示的外部循环 ..无法理解内部 while 循环。如果您能帮助我,将不胜感激。
-
归结为计数。一些提示:说
n = end - first,第一个内部循环迭代n/2次,在最坏的情况下。第二个循环基本相同,又是n/2次。所以外部循环的主体归结为n/2 + n/2 = n。 -
@Kenney 所以外循环的主体现在是 n。并且外循环本身是o(n),所以乘法不应该是o(n ^ 2)。如果我错了,请随时纠正我的概念
-
如果外循环是
for ( i = 0; i < n; i ++),那么是的,但复杂性在于内循环修改了start和end这一事实。尝试想象正在发生的事情:start仅递增,向end移动,end递减,向start移动。因此它们之间的差异变小了。您可能想要添加一些调试语句,并使用一个小的输入集运行它,以查看它的运行情况并感受它,如果有帮助的话。