Arrays 冒泡在最佳情况下对25个元素的数组排序
下面的应用/理论问题出现在我的算法课上,我从教授和助教那里得到了相互矛盾的答案 在(a)最坏的情况下,对数组进行冒泡排序需要多少次比较?(b) 最好的情况 我知道标准的bubblesort算法是 i=0到n-2的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。但我对这里的“比较”这个词感到困惑。我们认为什么是比较?如果检查自身,或者它执行的代码块,如果真的,我们认为它只是吗?在最坏
对于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是数组中元素的数量,当我们讨论时间复杂性时,它们通常与我们正在查看的集合的大小有关