【问题标题】:What 's Big O notation on this specific code? [closed]这个特定代码的大 O 符号是什么? [关闭]
【发布时间】:2013-05-21 14:13:59
【问题描述】:

我想知道大 O 表示法和大欧米茄表示法 (最坏情况,最好情况)这段代码 这是一个排序算法,我猜它有O(n)Omega(n)

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;
}

【问题讨论】:

  • 排序算法永远不会达到 O(n)。
  • 这是一个双向冒泡排序,所以它类似于冒泡排序O(n²)
  • @GriffeyDog 这仅适用于基于比较的排序。其他算法可以用增加的空间复杂度来提高时间复杂度(例如基数排序)。
  • 好像你真的不知道大 O 和 omega 符号。

标签: java performance algorithm big-o


【解决方案1】:

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

【讨论】:

  • 请你解释一下 =)
  • 如果列表已经排序,那么你永远不会设置done=false,所以函数A被调用一次。如果它是反向排序的,那么第一个 while 循环将最大元素设置到末尾,第二个 while 将最小元素设置在前面,依此类推。所以它需要 n/2 A 调用来对反向排序列表进行排序。
猜你喜欢
  • 2013-05-07
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多