冒泡排序算法实例详解
冒泡排序算法实例详解
1.复杂度与稳定性
算法时间复杂度
最坏情况:O(n^2)
最好情况:O(n)
平均情况:O(n^2)
空间复杂度:S(n)=O(1)
稳定性:稳定排序
2.过程介绍(以顺序为例)
1.从第一个元素开始逐个比较相邻的元素。如果第一个比第二个大(a[1]>a[2]),就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。此时在这一点,最后的元素应该会是最大的数,我们也称呼一遍这样的操作为:一趟冒泡排序。
3.针对所有的元素重复以上的步骤,每一趟冒泡排序的最大值已放在最后,下一次操作则不需要将此最大值纳入计算计算。
4.持续对每次对越来越少的元素,重复上面的步骤,直到没有任何一对数字需要比较,即完成冒泡排序。
3.图示过程
以数组数据{ 70,50,30,20,10,70,40,60}为例:
开始数据 | 70 | 50 | 30 | 20 | 10 | 70 | 40 | 60 |
---|---|---|---|---|---|---|---|---|
第一趟 | 50 | 30 | 20 | 10 | 70 | 40 | 60 | 70 |
第二趟 | 30 | 20 | 10 | 50 | 40 | 60 | 70 | 70 |
第三趟 | 20 | 10 | 30 | 40 | 50 | 60 | 70 | 70 |
第四趟 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 70 |
第五趟 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 70 |
第六趟 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 70 |
第七趟 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 70 |
如此图,每一次排序结尾,总有一个最大的数被放在了最后,然后这个趋势逐渐往前,但是,到了第四趟的时候,其实我们整个数据已经排序结束了,但是此时我们的程序还在进行,直到第5,6,7趟结束程序才算真正的结束,这其实是一种浪费算力的表现。
4.相关的代码
#include<iostream>
using namespace std;
void bubble_sort(int a[],int n) {for(int i=0; i<n; i++) {for(int j=0; j<n-i; j++) {if(a[j]>a[j+1]) {swap(a[j],a[j+1]); //交换数据}}}
}int main() {int a[8]= {70,50,30,20,10,70,40,60};int n=7;bubble_sort(a,n);for(int i=0; i<=n; i++) {cout<<a[i]<<' ';}return 0;
}
在这里提示一下,由于C++的namespace std命名空间的使用,std自带了交换函数swap(a,b),我们可以直接使用,其功能是交换a与b的两个值,在教程后面的排序中会经常用到,当然你可以自定义swap函数,其模板代码为:
template<class
T> //模板类,可以让参数为任意类型
void
swap(T &a,T &b) {
T c(a);
a=b;
b=c;
}
或者指定类型修改为整形,如:
void swap(int &a, int &b) { //指定类型int temp = a;a = b;b = temp;
}
那么我们的冒泡排序就算学完了,其实冒泡排序是八大排序中最简单及基础的排序,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序算法实例详解相关推荐
- html5走格子游戏,JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解 发布时间:2020-09-26 20:42:24 来源:脚本之家 阅读:112 作者:krapnik 本文实例讲述了JS/HTML5游戏常 ...
- Manacher算法 , 实例 详解 . NYOJ 最长回文
51 Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 Manacher 算法 定义数组 p[i]表示以i为 ...
- python如何调用文件进行换位加密_python 换位密码算法的实例详解
python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解
java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...
- python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码
利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- python类是实例的工厂_Python设计模式之工厂方法模式实例详解
本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...
- python装饰器函数-Python函数装饰器常见使用方法实例详解
本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...
最新文章
- autograd库测试笔记-(一个基于Numpy的自动求导库)
- P6 根轨迹分析法-《Matlab/Simulink与控制系统仿真》程序指令总结
- groovy怎样从sql语句中截取表名_《SQL基础教程》学习笔记
- 计算机和网络老是断开,电脑插上网线还是显示断开连接怎么办
- 有没有什么好的C++视频教程?
- 21 MM配置-采购-定义采购组
- 标准日本语 05_003
- 最近公共祖先 python_lintcode :最近公共祖先
- 【gitee】fatal: unable to access ‘https://username:password@gitee.com: Port number ended with ‘l‘
- ACM/IOI 历年国家集训队论文集和论文算法分类整理
- oracle导出导入同义词,oracle同义词语句备份
- 东大22春领导科学与决策X《领导科学与决策》在线平时作业3百分非答案
- java 反应堆模式_Java NIO 反应堆模式
- 叫谁修猫呢?叫蓝总|ONES 人物
- 【习题5】用Python完成新建文档写古诗+复制
- 关于轩辕剑3外传 swd3eDvd.exe报错问题
- webRTC(二十四):web远程多台android的实现
- Java模拟售票窗口代码_java多线程模拟售票,多个窗口售票
- 【图像融合】基于随机游走算法实现多焦点图像融合含Matlab代码
- FCF中地址控制域设定值对帧中所包含地址的影响