用于排序插入的Big O表示法

时间:2014-10-09 21:19:10

标签: java

这里是数组的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次。

1 个答案:

答案 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)