Java 嵌套循环运行时间复杂性分析
我在下面得到了一个插入排序算法,它包括嵌套for循环: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
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)
。我非常同意:-)