Answers:
您提供的所有复杂度都是正确的,但是它们以Big O表示法给出,因此将省略所有加法值和常数。
为了回答您的问题,我们需要专注于对这两种算法的详细分析。这种分析可以手工完成,也可以在很多书中找到。我将使用Knuth的《计算机编程艺术》的结果。
平均比较数:
现在,如果绘制这些函数,将得到如下所示的内容:
如您所见,即使两种排序方法具有相同的渐近复杂度,气泡排序也会随着元素数量的增加而变得更加糟糕。
该分析基于以下假设:输入是随机的-可能并非总是如此。但是,在开始排序之前,我们可以随机排列输入序列(使用任何方法)以获得平均大小写。
我省略了时间复杂度分析,因为它取决于实现,但是可以使用类似的方法。
渐近成本或数学随着函数的参数趋于无穷大(即其增长率)而描述函数的极限行为。
如果两个算法以相同的速率增长,则函数本身(例如,比较和/或交换的次数)对于具有相同渐近成本的两种算法可能会有所不同。
更具体地说,Bubble排序平均每个条目需要交换(每个条目从其初始位置到最终位置逐元素移动,每个交换涉及两个条目),而Selection排序仅需要(找到了最小值/最大值,将其交换一次到数组末尾。1
就比较次数而言,Bubble排序需要进行比较,其中是条目的初始位置与其最终位置之间的最大距离,对于均匀分布的初始值而言,通常大于。但是,选择排序始终需要比较。k n / 2 (n − 1 )× (n − 2 )/ 2
总而言之,渐近限制使您对算法的成本相对于输入大小的增长方式有一个很好的了解,但是对于同一组内不同算法的相对性能则没有任何评论。
冒泡排序使用更多的交换时间,而选择排序避免了这种情况。
使用选择排序时,它n
最多交换一次时间。但是当使用冒泡排序时,它几乎交换n*(n-1)
。显然,即使在内存中,读取时间也比写入时间短。比较时间和其他运行时间可以忽略。因此,交换时间是问题的关键瓶颈。