Arrays 冒泡在最佳情况下对25个元素的数组排序

Arrays 冒泡在最佳情况下对25个元素的数组排序,arrays,algorithm,sorting,time-complexity,Arrays,Algorithm,Sorting,Time Complexity,下面的应用/理论问题出现在我的算法课上,我从教授和助教那里得到了相互矛盾的答案 在(a)最坏的情况下,对数组进行冒泡排序需要多少次比较?(b) 最好的情况 我知道标准的bubblesort算法是 i=0到n-2的 对于j=n-1到i+1 如果A[j-1]>A[j] 互换(A[j-1],A[j]) 实际上我已经在谷歌上搜索了这个问题,而这个问题的答案实际上分别是300和24。但我对这里的“比较”这个词感到困惑。我们认为什么是比较?如果检查自身,或者它执行的代码块,如果真的,我们认为它只是吗?在最坏

下面的应用/理论问题出现在我的算法课上,我从教授和助教那里得到了相互矛盾的答案

在(a)最坏的情况下,对数组进行冒泡排序需要多少次比较?(b) 最好的情况

我知道标准的bubblesort算法是

i=0到n-2的

对于j=n-1到i+1
如果A[j-1]>A[j]
互换(A[j-1],A[j])

实际上我已经在谷歌上搜索了这个问题,而这个问题的答案实际上分别是
300
24
。但我对这里的“比较”这个词感到困惑。我们认为什么是比较?如果检查自身,或者它执行的代码块,如果真的,我们认为它只是<代码>吗?在最坏的情况下,swap和
if
语句将总共执行
n(n-1)/2次。但是,在最佳情况下,
if
语句将像以前一样检查有效性
n(n-1)/2次,但是由于数组是在最佳情况下排序的,因此不会发生交换。这意味着最坏情况和最好情况下的比较次数相同,不是吗

我的教授说“比较”意味着“比较两种元素”,但没有解释更多。我的TA认为这可能是基于
for
循环的执行次数

这让我更加困惑:我们如何从这个算法定义中提取出最佳情况下的bubblesort是
O(n)
?显然,在最佳情况下不会发生交换,但内部循环将针对外部for循环中的每个
i
值运行,因此算法将遍历数组
n(n-1)/2次。这里给出O(n)
n-1
次到底是什么

我找到的原始问题的答案使用了优化的bubblesort算法,该算法只使用1 for循环,如果没有发生交换,该循环将退出。对于这个问题,这是一个更好的算法吗?i、 e

bubblesort_优化(A)
假设我们没有完成排序
虽然我们还没有完成排序
假设我们已经完成了排序
从i=1到n-1逐个遍历列表元素。
如果A[i-1]>A[i],则交换
如果发生交换,我们没有完成排序

在这个特殊的例子中,这一切从何而来是非常明显的。但是讲座和我们的书中的算法从来没有提到这一点

谢谢你的阅读

<> P>我们认为什么是比较?

if
语句是比较。这是该代码段中唯一测试任何内容的代码

这意味着最坏情况和最好情况下的比较次数相同,不是吗

有了这个代码片段,是的

如何从该算法的定义中提取最佳情况下的bubblesort是
O(n)

根据前面的答案,不是这样的

跳到最后一个问题(因为它回答了剩余的问题):

我找到的原始问题的答案使用了优化的bubblesort算法,该算法只使用1 for循环,如果没有发生交换,该循环将退出。对于这个问题,这是一个更好的算法吗


它可能更复杂,这取决于它的编写方式,但在优化比较次数方面,它会更好。

您是正确的,对于这个精确的伪代码,所进行的比较次数总是相同的,因为代码每次都进行相同的比较。请注意,此代码不执行冒泡排序通常执行的操作,即在没有发生交换的情况下,一旦进行了传递,就会中断循环,因此在最佳情况下,它实际上不会在时间O(n)内运行。此代码始终需要时间Θ(n2)。事实上,正是因为这个原因,我才不会真正称之为代码冒泡排序

如果您更新代码,以便在没有对底层数组进行任何更改的情况下脱离外部循环,那么您将开始获得更有趣的模式和行为。这就是你得到O(n)最佳情况运行时,在最佳情况下进行24次比较,等等

我们认为什么是比较?我们认为它只是IF检查本身,还是它执行的代码块,如果是真的?< /P> 只需检查
if
。然而,您是正确的,在最坏的情况下,互换的数量是完全相同的

我们如何从该算法的定义中提取最佳情况下的bubblesort为O(n)

您完全正确,您使用的实现在最佳情况下不是O(n)。当内部循环中没有交换时,您需要进行一个小的优化以使其停止:

bool done = false
while (!done)
    done = true
    for j = n - 1 to i + 1
         if A[j - 1] > A[j]
              swap(A[j - 1], A[j])
              done = false
这样,只要内部循环中没有进行交换,外部循环就会停止。在最好的情况下,内部循环的第一次迭代也是最后一次迭代,产生预期的O(n)个比较

for i = 0 to n - 2
   for j = n - 1 to i + 1
       if A[j - 1] > A[j]
           swap(A[j - 1], A[j])
正如你所建议的,这里进行的比较是第三行。我认为这其中有意义的部分是,我们正在比较A的两个元素。A[j-1]和A[j]。我们在这里所做的具体比较是一个更大的比较。(X1>X2?)我们正在研究两个元素,并确定它们之间的关系

我已经在谷歌上搜索了这个问题,问题的答案分别是300和24

对于特定的n值,这将是正确的,而不是对于所有n的情况。n是数组中元素的数量,当我们讨论时间复杂性时,它们通常与我们正在查看的集合的大小有关