一.什么是冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
时间复杂度:O(n²)
算法稳定性:稳定排序算法
实 质:把小(大)的元素往前(后)调
思想: 交换思想
原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
图解:(参考《Java数据结构和算法》书籍上的图片)
未排序的一行人:
从第一个人开始与第二个人进行比较,矮的站前面,高的继续和后面的人比,直到最后一人成为最高的,那么第一轮比较结束
然后第二轮继续比较,从第一个人开始依次比较,注意本轮不需要和最后一人(最高的)进行比较了,将第二高的人排在了倒数第二的位置,本轮结束。后续按照此规则继续比较,直到整个队列从小到大排序。如下:
二. 逻辑推演
现有一个数组,里面的数据为: [11,17,28,34,67,48,47,66],我们以此数据来分析:
第一轮比较:
原始数据排列情况如下:
我们冒泡排序比较是从第一个元素开始进行,然后和第二个元素进行比较,由于11和17比较,11比17小,不需要交换;因此!紧接着应该由17和28进行比较,这时发现17比28小,位置继续保持不变!
接下来继续由28和34进行比较:
发现依然不变,继续让34和67进行比较:
34比67小,依然不变。继续:
当67和48比较的时候,由于67比48大!因此两者交互了!
接下来:67和47进行比较,67比47大,继续交换:
最后,67和66继续比较,发现67更大,那么继续完成交换:
小结:
通过第一轮 7 次比较,最终将最大值交换到了最右边!
第二轮比较:
依然从第一个数进行比较,将第二大的数给排序到右边去:
第三轮:
排序后的结果:
第四轮:
第五轮:
第六轮:
第七轮:
总结:
第一轮比较7次
第二轮比较6次
第三轮比较5次
...
第七轮比较1次