Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套循环运行时间复杂性分析_Java_Algorithm_Performance_Nested Loops_Insertion Sort - Fatal编程技术网

Java 嵌套循环运行时间复杂性分析

Java 嵌套循环运行时间复杂性分析,java,algorithm,performance,nested-loops,insertion-sort,Java,Algorithm,Performance,Nested Loops,Insertion Sort,我在下面得到了一个插入排序算法,它包括嵌套for循环: public InsertionSort( AnyType [] a ){ int m; for( int n = 1; n < a.length; n++ ){ AnyType temp = a[n]; for( m = n; m > 0 && tmp.compareTo( a[ m - 1] ) <= 0; m-- ) a[ m

我在下面得到了一个插入排序算法,它包括嵌套for循环:

public InsertionSort( AnyType [] a ){
    int m; 
    for( int n = 1; n < a.length; n++ ){
        AnyType temp = a[n];
        for( m = n; m > 0 && tmp.compareTo( a[ m - 1] ) <= 0; m-- )
            a[ m ] = a[ m - 1 ];
        a[ m ] = temp;  
    } 
} 
public InsertionSort(AnyType[]a){
int m;
for(int n=1;n0&&tmp.compareTo(a[m-1])
第二个是O(N^2)

那是错误的。看看怎么做

考虑到
a.length=N
,TC应该是
O(N^2)

因为
(1+2+3+…+N-1)=N(N-1)/2=O(N^2)

内部循环比上一次多运行1次

[1, 1]
[2, 1]
[3, 1]
...
[N-1, 1]
for(int n=1;n 在上面这一行中,您将通过数组n-1次(因为您从索引1开始一直到a.length-1),因此O(n)


对于(m=n;m>0&&tmp.compareTo(a[m-1]),让我们像下面这样简化代码

public InsertionSort( AnyType [] a ){
    // A value n
    for( ; n < length ; ){
        // A value m
        for( ; m < someLength ; ) {
            // do something.
        }
    } 
}
public InsertionSort(AnyType[]a){
//A值n
对于(;n<长度;){
//A值m
对于(;m
正如你所说,“someLength”可以是n-1中的1

但是让我们看看内部循环方面的代码

    blahblah
        for( ; m < someLength ; ) {
            // do something.
        }
    blahblah
blahblah
对于(;m
它只运行一些长度-m(如果小于0,则不运行)

,这是线性的

,表示为N(表示O(N))


还有一件事

1+2+3+4+…+n-1没有外循环是不能发生的,是吗


那么,为什么要计算内部循环的复杂性呢?

第二个循环在我看来也是
O(N)
,这将给出预期的
O(N^2)
插入排序的总体性能。但如果我尝试对具有所有相同元素的数组进行排序,则在排序结束之前,比较和交换的次数都是1+2+3+…n-1次,因此我得到n(n-1)/2=O(n^2),而这不是插入排序的传统代码,我的老师通过替换[m-1]进行了一些更改。)内循环的条件不同这一事实对上界没有影响,上界最多覆盖数组中的每个元素,因此使其
O(N)
。我非常同意:-)