![aff40a713aeceb3ae6cfc2d6f2841ebd.png](https://i-blog.csdnimg.cn/blog_migrate/be84333826db2a65bc5c6844e8d19bbb.png)
排序之冒泡排序算法的实现
算法思路:
该算法依次比较两个相邻数据的大小,上面数值较大则交换两个数的位置,否则位置不变。过程中较大的数会"沉在底部”,较小的数依次像气泡一样上浮,故称该算法为“冒泡排序”。
从第一对开始依次比较,顺序错误就进行交换,正确就不改变,执行完一趟后,底部将得到最大的数。接着重复上述操作(除了最后一个),直到得到正确的顺序。
过程示例:
![c0888681f78480606b145d7a65effd0d.png](https://i-blog.csdnimg.cn/blog_migrate/2c9a9adcea7ea100cb9e42c9fe6b8ffd.png)
![b0579dad72b715521f097457a83ed06f.png](https://i-blog.csdnimg.cn/blog_migrate/509ac2bd916d52c50e0ac3595771ce68.png)
![761b1c4ef1cf5efd8772fe8e6202255a.png](https://i-blog.csdnimg.cn/blog_migrate/9ab5813237cf7f374c6fd245d3b1e75c.png)
![c205d1edaa40592137a7f1e7bc765bb8.png](https://i-blog.csdnimg.cn/blog_migrate/31858ba544109225e8e3060d5e89f688.png)
C语言实现:
#include
测试结果:
![044c77b82638f2ad8d8826746391c636.png](https://i-blog.csdnimg.cn/blog_migrate/5a3a79d48addcbb33e5eeef9e3866324.png)
冒泡排序时间复杂度分析:
若数据初始状态为正序,则一趟扫描就可以得到结果。比较次数为n-1,赋值次数为0(交换次数为0)。
故冒泡排序最好情况下时间复杂度为O(n)。
最坏情况下(逆序),要执行n-1趟,每一趟都要进行交换次数为n-i-1(0≤i≤n-1)
此时,比较次数最大为 :
1+2+...+n-1=
赋值次数(元素移动次数)最大为:
3(1+2+...+n-1)=
(这种情况下,每比较一次,都要交换数据,赋值三次)
冒泡排序最坏情况下时间复杂度为O(
综上,冒泡排序总的平均时间复杂度为O(
算法稳定性:
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。[1]
Bingo!
参考
- ^百度百科:冒泡算法