编程算法之冒泡排序

Posted 软件测试之窗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程算法之冒泡排序相关的知识,希望对你有一定的参考价值。

冒泡排序

冒泡排序(Bubble Sort),是一种对数据进行排序的方法,它非常简单。重复依次访问要排序的元素,依次比较两个相邻元素。如果顺序错误,交换两个元素的位置。遍历元素直到没有相邻元素需要交换为止,也就是元素列表已经排序完成。

这个算法的名字由来是较小的元素会经由交换慢慢“浮”到数列的顶端,就如同游泳时吐出的气泡最终会上浮到水面一样,故名“冒泡排序”。

算法原理

冒泡排序算法的原理如下:假定由小到大进行排序。

从第一个元素起,比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在结束第一轮比较之后,最后的元素将会是最大的元素。

针对所有的元素重复以上的步骤,每一轮减少最后一个元素。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较。

        代码如下:


def bubble_sort(nums): count=len(nums) for i in range(count - 1): # 外层循环进行的次数 for j in range(count - i - 1): if nums[j] > nums[j + 1]: nums[j], nums[j + 1] = nums[j +1], nums[j] return nums print(bubble_sort([19, 49, 79,9, 39, 21, 22]))# 输出:[9,19, 21, 22, 39, 49, 79]

如果数据本身是有序的,数据的顺序排好之后,冒泡算法仍然会继续进行下一轮的比较,直到n-1轮比较完成。其实后面的比较是没有意义的。我们可以对该方案进行优化,采用设置交换标志位flag,在一轮比较之前设置flag标志为False, 如果发生了交换flag设置为True

这样当一轮比较结束后如果flag仍为False,表示这一轮元素没有发生交换,说明元素的顺序已经有序,没有必要继续进行下去,跳出比较流程。优化的冒泡排序算法如下:

defbubble_sort2(nums): count =len(nums) flag = Flase; # 是否交换的标志 for i in range(count - 1): # 外层循环进行的次数 flag = 0; for j in range(count - i - 1): if nums[j] > nums[j + 1]: nums[j], nums[j + 1] = nums[j +1], nums[j] flag = True # 判断标志位 if(flag==False): break; return nums
print(bubble_sort2([19,49, 79, 9, 39, 21, 22]))
算法流程图


 

算法时间复杂度分析

若元素的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数和元素移动次数均达到最小值, 所以冒泡排序最好的时间复杂度为 O(n)

若初始元素是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1in-1),且每次比较都必须移动元素来达到交换元素位置的目的。在这种情况下,比较和移动次数均达到最大值。

 冒泡排序的最坏时间复杂度为O(n2) 因此冒泡排序总的平均时间复杂度为O(n2)

算法的稳定性

算法稳定性,冒泡排序就是把大的元素往后移动。是通过相邻的两个元素比较,如果需要交换,交换也发生在这两个元素之间。所以如果两个元素相等,是不会再交换的。如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个元素调整在一起,这时候也不会交换,所以相同值元素的前后顺序不会发生改变,所以冒泡排序是一种稳定排序算法。


 


以上是关于编程算法之冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

动态可视化十大排序算法之冒泡排序

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

javapythonphp之经典冒泡排序算法

每日编程-108期链表排序之冒泡排序

shell脚本编程之冒泡排序脚本实现(解释非常详细,涉及正则表达式)