【算法基础】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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步