今天的课后题有一个如下的程序
1 // 1.10 复杂度.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include <iostream> 5 6 using namespace std; 7 int main () 8 { 9 int n=100; 10 int k=0; 11 int a[200]; 12 int t=0; 13 int count=0; 14 for (int i=1; i<=n-1; i++) 15 { 16 k=i; 17 for(int j=i+1; j<n; j++) 18 { 19 if (a[j]>a[j+1]) 20 { 21 k=j; 22 23 24 } 25 cout<<i<<"\t"<<j<<"\t"<<count++<<endl; 26 } 27 t=a[k]; 28 a[k]=a[i]; 29 a[i]=t; 30 } 31 cout<<double(count)/(n*n)<<endl; 32 33 return 0; 34 }
书上给的答案的复杂度为O(n),我自己的感觉应该是O(n2),遂在原文末尾加上 行31 的显示输出语句进行验证,多次尝试后,发现答案确实趋近(n2)/2,所以个人感觉书上答案有误,求教大家~
我发现问题可能是if语句在执行时有概率,我没有计算进去,但是该怎么算。暂时还没有头绪。