设为首页 加入收藏

TOP

C语言冒泡排序及其复杂度分析
2015-04-07 15:29:12 来源: 作者: 【 】 浏览:36
Tags:语言 冒泡 排序 及其 复杂度 分析

因为谭浩强的C语言教材,大家最熟悉的可能就是冒泡排序。
下面是冒泡排序的一个C语言实现,a是数组首地址, size 是数组元素的个数。


冒泡排序的思想,是让最大的数浮动到数组最后的位置,其次大的数浮动到数组倒数第二个位置……
当然,你也可以从大到小排序,也可以从后向前冒泡。其特征操作是相邻元素的比较和交换。


时间复杂度分析。其外层循环执行 N - 1次。内层循环最多的时候执行N次,最少的时候执行1次,平均执行 (N+1)/2次。
所以循环体内的比较交换约执行 (N - 1)(N + 1) / 2 = (N^2 - 1)/2(其中N^2是仿照Latex中的记法,表示N的平方)。按照计算复杂度的原则,去掉常数,去掉最高项系数,其复杂度为O(N^2)


冒泡算法的性能改进。上述算法的性能还有改进的空间。给定一个整数序列 [9, 3, 4, 5, 7],每完成一次上述算法的外层循环,整数序列变化为:


我们发现当第一次外层循环完成后,排序就完成了。后面的循环只有比较,而没有交换。
当一次外层循环中,相邻的元素没有发生交换,就说明数组已经是有序的了,这时可以跳出循环。
这样,我们可以设置一个布尔变量,记录一次外层循环中是否发生交换,如果未发生交换,算法就返回。


改进的冒泡排序的C语言实现如下:


按照改进的算法,对于一个已经有序的数组,算法完成第一次外层循环后就会返回。
实际上只发生了 N - 1次比较,所以最好的情况下,该算法复杂度是O(N)


2015-03-18 Wed


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java开发熟手该当心的11个错误 下一篇Linux下C函数dlopen实现加载动态..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: