冒泡排序的执行步骤可分为两种。
❏ 比较:比较两个数看哪个更大。
❏ 交换:交换两个数的位置以使它们按顺序排列。
先看看冒泡排序要进行多少次比较。回顾之前那个5个元素的数组,你会发现在第1次轮回我们为4对元素进行了4次比较。
到了第2次轮回,则只做了3次比较。这是因为第1次轮回已经确定了最后一个格子的元素,所以不用再比较最后两个元素了。
第3次轮回,只比较2次;第4次,只比较1次。
算起来就是:
4 + 3 + 2 + 1=10次比较。
推广到N个元素,需要
(N -1) + (N -2) + (N -3) + … + 1次比较。
分析过比较之后,再来看看交换。
如果数组不只是随机打乱,而是完全反序,在这种最坏的情况下,每次比较过后都得进行一次交换。因此10次比较加10次交换,总共20步。
现在把两种步骤放在一起来看。一个含有10个元素的数组,需要:
9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1=45次比较,以及45次交换,共90步。20个元素的话,就是:19 + 18 + 17 + 16 + 15 + 14 + 13 + 12 + 11 + 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1=190次比较,以及190次交换,共380步。
效率太低了。元素量呈倍数增长,步数却呈指数增长,如下表所示。
再看仔细一点,你会发现随着N的增长,步数大约增长为。
因此描述冒泡排序效率的大O记法,是O()。规范一些来说:用O(
)算法处理N个元素,大约需要
步。O(
)算法是比较低效的,随着数据量变多,其步数也剧增,如下图所示。
注意O()代表步数的曲线非常陡峭,O(N)的则只呈对角线状。
最后一点:O()也被叫作二次时间。