Arrays 我的搜索算法的最佳和最坏运行时(类似于冒泡排序)?

Arrays 我的搜索算法的最佳和最坏运行时(类似于冒泡排序)?,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,所以我知道这个算法非常简单,但我无法理解代码的时间复杂性。它接受一个数组(比如5个数字),并以递增的顺序对其进行排序,排序方式与冒泡排序类似(但不完全相同)。此算法的最佳和最差运行时是什么 int sort(int arr[1...n]){ while(i <= n){ k = n; while(k >= i+1){ if (arr[k-1] > arr[k]){ tmp = arr[k-1]; arr[k-1]

所以我知道这个算法非常简单,但我无法理解代码的时间复杂性。它接受一个数组(比如5个数字),并以递增的顺序对其进行排序,排序方式与冒泡排序类似(但不完全相同)。此算法的最佳和最差运行时是什么

int sort(int arr[1...n]){
  while(i <= n){
    k = n;
    while(k >= i+1){
      if (arr[k-1] > arr[k]){
        tmp = arr[k-1];
        arr[k-1] = arr[k];
        arr[k] = tmp;
      }
      k--;
    }
    i++;
  }
}
int排序(int-arr[1…n]){
而(i=i+1){
if(arr[k-1]>arr[k]){
tmp=arr[k-1];
arr[k-1]=arr[k];
arr[k]=tmp;
}
k--;
}
i++;
}
}
我的理由是:

最坏的情况是数组按相反顺序排序,例如[5,4,3,2,1]。我知道外部while循环会被执行n次,但内部while循环让我很反感。对于外部while的每次迭代,我认为内部while执行I+1次,因此对于我给出的数组,它将执行内部while 4,3,2,最后执行1次(这是内部while循环的(n-1)次执行的总数)…把它们放在一起,我有n*(n-1),那么这是否意味着最坏的情况是O(n^2)


最佳情况是当数组已经排序时,比如[1,2,3,4,5]。因此,在这种情况下,我们永远不需要进行任何数字交换,而内部while中的if语句永远不会执行。但是,尽管数组已经排序,但代码似乎在所有内容中循环。我们仍然会经历这两个while循环,这让我相信它仍然是n*(n-1),但这在我看来似乎是错的。非常感谢您的帮助。

在最坏的情况下,将有1+2+3+…(n-1)次迭代,因此这就是
n(n-1)/2
=>
n^2/2-n/2


忽略常数,该算法的最坏情况是
O(n^2-n)
复杂度,即
O(n^2)

即使数组已经排序,代码也会“遍历所有内容”,这并不奇怪。你不会告诉它不要

您需要添加一个sentinel值,该值告诉它在数组已排序时停止

在代码中,如果在单个过程中从未输入内部
if
语句,则您知道数组已排序。因此,您要做的是在外部循环的每个迭代开始时初始化一个标志。如果输入了
If
语句,则设置标志。如果在外循环迭代结束时未设置该标志,则您知道数组已排序。代码如下:

int sort(int arr[1...n]){
  bool didSwap = true;
  while(i <= n && didSwap){
    didSwap = false;
    k = n;
    while(k >= i+1){
      if (arr[k-1] > arr[k]){
        tmp = arr[k-1];
        arr[k-1] = arr[k];
        arr[k] = tmp;
        didSwap = true;
      }
      k--;
    }
    i++;
  }
}
int排序(int-arr[1…n]){
bool-didSwap=true;
而(i=i+1){
if(arr[k-1]>arr[k]){
tmp=arr[k-1];
arr[k-1]=arr[k];
arr[k]=tmp;
didSwap=true;
}
k--;
}
i++;
}
}

这将使您的代码在数组排序时“提前退出”。

您可以运行代码并对其进行一点检测,以收集循环针对不同输入运行的频率@卡尔雷德:不可能通过经验分析来确定算法的复杂性。看,很有趣,谢谢你。我一直认为,至少通过观察一些不同输入的运行,您可以“感觉”到复杂性。也许这就是我面试失败的原因:)@BJMyers没有,但我们可以通过数值分析和曲线拟合计算出一个可能的估计,请看:这意味着我的想法是正确的,那么正确吗?因为
n(n-1)=n^2-n
Tho,这个推理有点像手的波浪。。。如果你真的要证明这一点,你必须建立和解决它们…@VekktoneOfficial是的,这是正确的。此外,实际上,您可以使用此方法减少时间:如果
i
的迭代中没有条件为真,您可以完全停止流程。因为数组已经处于排序状态。因此,您的最佳情况变为
O(n)
好吧,我想我理解这一点,但是在上面的代码中,无论迭代
I
的条件是什么,内部while循环都不会继续执行吗?@VekktoneOfficial只要您意识到外部循环迭代中的条件从来都不是真的,就停止外部循环的迭代。