我正在尝试计算此选择排序实现的大O时间复杂度:
void selectionsort(int a[], int n)
{
int i, j, minimum, index;
for(i=0; i<(n-1); i++)
{
minimum=a[n-1];
index=(n-1);
for(j=i; j<(n-1); j++)
{
if(a[j]<minimum)
{
minimum=a[j];
index=j;
}
}
if (i != index)
{
a[index]=a[i];
a[i]=minimum;
}
}
}
我该怎么做呢?
答案 0 :(得分:1)
让我们先看一下外环的内部。它使O(1)与初始赋值一起工作,然后有一个运行n - i次的循环,然后O(1)在末尾执行更多工作来执行交换。因此,运行时间是Θ(n - i)。
如果我们总结从0到n - 1,我们得到以下结果:
n +(n - 1)+(n - 2)+ ... + 1
这个着名的和为Θ(n 2 ),因此运行时间为Θ(n 2 ),匹配the known runtime of this algorithm。
希望这有帮助!
答案 1 :(得分:1)
正式地,您可以使用以下方法获得具有增长顺序的确切迭代次数:
执行以下片段代码(原始代码的合成版本),sum
将等于T(n)的封闭形式。
sum = 0;
for( i = 0 ; i < ( n - 1 ) ; i ++ ) {
for( j = i ; j < ( n - 1 ) ; j ++ ) {
sum ++;
}
}