1 用C语言写出冒泡排序算法,C语言冒泡排序算法浅析

【摘要】冒泡排序算法是C语言常见排序算法之一,该算法的优点是逻辑清晰,代码简洁,缺点是时间复杂度较高。本文介绍了传统冒泡排序算法的基本思想,并对算法的改进进行分析,已降低该算法的时间复杂度。

【关键字】C语言,算法,冒泡排序

1.引言

在C语言的学习中,在学习完程序设计结构以后,就会遇到关于排序的问题。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序和归并排序等排序算法。本文主要对传统的冒泡排序算法的算法逻辑和算法实现等进行分析,对传统算法中不必要的循环进行了改进,在一定程度减少了算法的循环次数和数据交换次数,从而降低了算法的时间复杂度。

2.传统的冒泡排序算法

冒泡排序算法对两个相邻的数进行比较,较小的数“上浮”,较大的数“下沉”,对参加比较的两个相邻的数据而言,如果前一个数比后一个数大,则交换这两个数;否则不用交换。对每一对相邻的两个数进行完一次比较后,最后的一个数就是最大的数,接下来对除去最后一个数的其他数再次进行每一对相邻的两个数的比较,最后的数便是第二大的数。如果有n个元素的数组a[n]:

第一轮,逐个比较(a[1], a[2]),(a[2],a[3]),(a[3],a[4]), ……,(a[n-1],a[n]);最大的元素会被移动到a[n]上。第二轮,逐个比较(a[1],a[2]),(a[2],a[3]),(a[3],a[4]), ……,(a[n-2],a[n-1]);第二大元素会被移动到a[n-1]上, 以此类推,经过n-1轮比较后,这n个数排序成功。

算法代码如下:

3.算法的改进

3.1若排序提前完成,减少不必要的循环

上述算法中,若数组包含n个元素,那么必须进行n-1轮比较。在多数情况下,对n个数进行排序,并不一定要进行n-1轮比较。例如对5 8 9 1 2 3这六个数进行排序,只需要进行3轮比较就可以排序成功,而不需要进行5轮比较。这说明在第n-1轮比较前,就有可能完成排序,因此,可以对上述算法进行改进。改进的突破点在如果排序在第n-1轮比较前已经完成,则不再进行后续比较,可减少循环次数。具体方法是:设置一个变量来标识当前轮的比较是否存在数据交换的情况,如果存在数据交换,则说明排序可能仍未完成,本轮比较结束后继续下一轮比较,如果不存在数据交换,则说明当前轮比较时,排序已经完成,不用再继续进行后续的比较。在每一轮比较开始时,给标识变量赋值为1,然后在每一轮的两两相邻的数比较时,如果存在数据交换,则将标识变量的值改为0。每一轮比较结束后,如果标识变量的值为1,则说明没有发生数据交换,排序已经完成,不用再继续比较;如果标识变量的值为0,则说明排序可能未完成,还需进行下一轮的比较。改进后的算法如下:

3.2 每一轮比较找到当前的最大数时,同时找到当前的最小数

以上的两个算法中,在每一轮的相邻两数比较时,都是从第一对相邻两数中找到较大数,每一轮比较只找到当前比较范围的最大数。如果能同时找到当前比较范围的最小数,效率可以提高一倍,循环次数也可以大幅减少,相当于在同一轮的比较中,找到一个最大数“下沉”到最后,同时找到一个最小数“上浮”到最前面。具体方法为:在找到当前轮比较的最大数后,在进行下一轮比较之前,从当前轮排序范围的最后一对相邻的两数开始进行相邻两数的比较,将每次比较结果中的较小数向前存放,直到把把最小数交换到第一个位置,原理和找到最大数存放到最后一样,然后根据标识变量的值判断是否开始进行下一轮的比较。改进后的算法如下:

经过上述改进,算法在每一轮比较的效率上提高了一倍。但值得注意的是,改进的主要效果是减少了循环次数,对于数据交换次数而言,并没有减少。

4结束语

传统的冒泡排序算法代码简洁,性能稳定,通过上述的改进,可以减少循环的次数,提高算法的效率,但总体而言其时间复杂度仍然较高为n2,冒泡排序算法适用于规模较小的排序。

参考文献:

[1] 严蔚敏.数据结构[M].清华大学出版社,1997,4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值