这里是数组的orderedInsertion的代码:
public void orderedInsert(int x){
int i =0;
for(i=0;i<count;i++) if(arr[i]>x) break;
for(int j=count-1;j>=i;j--) arr[j+1] = arr[j];
arr[i]=x;
count++;}
如果不是在IF语句之后立即使用中断,我确实实现了第二个for循环(具有j变量的那个,如下所示: 编辑代码:
public void orderedInsert(int x) {
boolean flag = false;
int i =0;
for (i=0; i<count; i++) {
if (arr[i]>x) {
for (int j=count-1; j>=i; j--) {
arr[j+1] = arr[j];
arr[i] = x;
count++;
flag = true;
}
if (flag)
break;
}
}
}
两种算法都会在O(N)中运行吗?这对我来说是有意义的,但我的导师说,如果你看到两个嵌套循环,这意味着它运行O(N ^ 2)。
对我来说有意义的是,即使在最坏的情况下,我们也只会遍历N次。
答案 0 :(得分:2)
这种情况似乎这两种算法即使它们不相似也是O(n)。 Count的使用方式不同,看起来第一个使用count来显示它改变的数组的大小。因此,如果有人在数组中放入一个元素,则计算增量。但第二个用于计算别的东西。对于arr [i] = x;也是如此。第一个似乎设置了一次,而第二个继续设置它。
嵌套循环的典型情况如下:
for(int j=count-1;j>=i;j--)
如果count = 100
for(int j=100-1;j>=0;j--) // 100 times it must iterate
//then i turns to 1
for(int j=100-1;j>=1;j--) //must iterate 99 times
etc...
如果它只是一个循环,它将只迭代100
for(i=0;i<count;i++) //iterate 100 times that is it, its done
但是使用嵌套循环迭代
when i=0 : it iterates 100 times
when i=1 : it iterates 99 times
when i=2 : it iterates 98 times
换句话说,如果这里只有一个循环,它只会迭代100次 但是使用这个嵌套循环,它循环100次+ 99次+ 98次等。这很可能特别是'if(arr [i]&gt; x)中断;'永远不会发生
同样根据Big Oh notation,如果某事需要(n(n-1))/ 2次完成,这就是O(n ^ 2)