在我试图弄清楚如何计算运行时间时,我看到了这段代码。据我所知,两个for循环计算为n^2
,但交换部分会让我失望。我想了解交换部分是否对最坏情况的运行时有任何影响,这只是O(n^2)
吗?
for(i = -1; i < N; i++) {
for(j = 0; j < N-1; j++) {
if a[j] > a[j + 1] {
swap( a[j], a[j + 1] )
}
}
}
答案 0 :(得分:0)
确定最坏的情况,考虑最坏情况的数据设置,然后使用time命令测量程序工作的实时,时间命令显示时间,经过时间,CPU时间(sys和用户)
答案 1 :(得分:0)
for(int i = 0; i < N-1; ++i) {
for(int j = 0; j < N-1; ++j) {
if a[j] > a[j + 1] {
swap(a[j], a[j + 1]);
}
}
}
比较次数恒定为(n-1)*(n-1)。交换次数取决于输入数组。最坏的情况是反向排序的数组:{n,n-1,n-2,...,2,1}这会产生n *(n-1)/ 2个交换。
对于bubblesort,只要内部循环没有产生交换,你就可以暂停:for(int i = 0; i < N-1; ++i) {
bool hasSwap = false;
for(int j = 0; j < N-1; ++j) {
if a[j] > a[j + 1] {
swap(a[j], a[j + 1]);
hasSwap = true;
}
}
if(!hasSwap)
break;
}
现在比较的次数也取决于输入数组。
答案 2 :(得分:0)
最坏情况下的计算复杂度为O(n ^ 2),如您所描述的那样,只要整体复杂性涉及主要项为O(n ^ 2),则可以忽略比较和交换,代码可以是改写如下:
for(i = -1; i < N; i++)
for(j = 0; j < N-1; j++)
function...
你应该看看big-O简化的规则: