多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】7.十大排序算法——冒泡排序

参考资料

 冒泡排序https://zhuanlan.zhihu.com/p/417620764

 

直观理解

以升序排列为例

像气泡在水中比重较轻,会逐渐上浮。冒泡排序就是从底部开始两两比较,把应该靠前的元素放在靠前的位置上、如果已经靠前则滑动窗口关注前一对元素

 

例子先行

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 void BubbleSort(vector<int>& arr);
 6 
 7 int main()
 8 {   
 9     vector<int> arr{5,4,3,2,1};
10     int dataLen=arr.size();
11     
12     //冒泡排序
13     BubbleSort(arr);
14     
15     //输出验证
16     for(int val:arr){
17         cout<<val<<endl;
18     }    
19     
20     return 0;
21 }
22 
23 //默认排为升序
24 void BubbleSort(vector<int>& arr){
25     int start=0;
26     int end = arr.size() - 1;
27     
28     //遍历次数,最后一个元素不必处理
29     for(int it = 0; it < end; it++){
30         //从底向前冒泡,到it为止,it之前的内容已经有序
31         for(int cur = end; cur > it; cur--){
32             //升序排列,设为<=;降序排列,设为>=
33             //保持不变
34             if(arr[cur-1] <= arr[cur]){
35                 continue;
36             }
37             
38             //对换
39             swap(arr[cur-1], arr[cur]);
40         }
41     }
42 }
复制代码

 

总结提炼

1时间复杂度是 O(n^2);

2空间复杂度为O(1);

3元素两两比较交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

4双层循环中起止条件有不同的设置,从后向前或从前向后,但内核的两两比较是相同的;

5基本步骤

(1)将整个序列分为两个序列(体现分治法),还未确定排序的序列,和已经排序好的序列;

(2)进行 n-1 次迭代;

(3)每次迭代都从未确定排序的序列中取出极值追加到已排序的序列后,这样已排序序列长度+1,未排序序列长度-1

 

拓展方向

 

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16915746.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起