2013-05-21 25 views
-3

我想知道大O符号和这个代码 这是一个排序算法的大欧米茄符号 (最坏的情况下,最好的情况下),我的猜测是,它有一个O(n)Omega(n)对这个特定代码有什么大O符号?

public static void swap(int[] A, int i,int j){ 
    int temp = 0; 
    temp = A[i]; 
    A[i] = A[j]; 
    A[j] = temp; 
} 

public static int[] MyAlgorithm(int[] A, int n){ 

    boolean done = true; 
    int j =0; 
    while(j<=(n-2)){ 
     if(A[j]>A[j+1]){ 
      swap(A,j,j+1); 
      done = false; 
     } 
     j = j+1; 
    } 
    j = n-1; 

    while(j>=1){ 
     if(A[j]<A[j-1]){ 
      swap(A, j-1,j); 
      done = false; 
     } 
     j = j-1; 
    } 

    if(done==false){ 
     MyAlgorithm(A,n); 
    } 

    return A; 
} 
+0

您将永远不会为排序算法实现O(n)。 – GriffeyDog

+0

这是一个双向的气泡排序,所以它就像冒泡排序那样是'O(n²)'。 –

+0

@GriffeyDog这只适用于基于比较的排序。其他算法可以增加空间复杂度以提高时间复杂度(例如基数排序)。 – chepner

回答

2

O(n^2)(列表[n, n-1, ..., 1]),Omega(n)[1, 2, ..., n]

+0

请你解释一下=) – user2336315

+0

如果列表已经排序,那么你从不设置'done = false',所以函数'A'被调用一次。如果它被反向排序,那么首先while循环将最大元素设置为结束,第二个同时将最小元素设置在前面,等等。所以需要用'n/2'''调用排序反向排序列表。 –