排序算法之冒泡排序

简介 :

冒泡排序(Bubble Sort)是最简单和最通用的排序方法,其基本思想是:在待排序的一组数

中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序 。由此可得,在排序过程中,大的数据往下沉,小的数据往上浮,就像气泡一样,于是将这种排序算法形象地称为冒泡排序 。------选自百度词条

总而言之,就是让每次循环后最大元素在最后,每个元素向自己的正确位置靠近。

时间复杂度:O(n^2)

Code :

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	const int N=50;//这里你们随便 
	int n,a[N];
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];//输入
	for(int i=0;i<n;i++)
		for(int j=0;j<n-1;j++)
			if(a[j]>a[j+1])//这里可以换成自己想要的符号,也就是升序和降序 
				swap(a[j],a[j+1]);
	for(int i=0;i<n;i++) cout<<a[i]<<" ";//输出 
}

优化 :

可是效率太低了,由于每进行一次外层循环,最后一个元素就归位了,所以不用考虑最后一个元素了,可以这样优化一下。

优化后Code :

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	const int N=50;//这里你们随便 
	int n,a[N];
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];//输入
	for(int i=0;i<n;i++)
		for(int j=0;j<n-1-i;j++)//优化 
			if(a[j]>a[j+1])//这里可以换成自己想要的符号,也就是升序和降序 
				swap(a[j],a[j+1]);
	for(int i=0;i<n;i++) cout<<a[i]<<" ";//输出 
}

优化2 :

但是,有的时候,你排序好了,它还是会运行,这里就可以再次优化,只要没有进行交换,就退出循环。

优化2Code :

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	const int N=50;//这里你们随便 
	int n,a[N];
	bool flag=0;//判断是否进行了比较 
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];//输入
	for(int i=0;i<n;i++){
		flag=0;
		for(int j=0;j<n-1-i;j++)//优化 
			if(a[j]>a[j+1]){//这里可以换成自己想要的符号,也就是升序和降序 
				swap(a[j],a[j+1]);
				flag=1;
			}
		if(flag==0) break;//优化2
	}
	for(int i=0;i<n;i++) cout<<a[i]<<" ";//输出 
}

优化3 :

依然太慢了,所以我们可以考虑再次优化,可以将 j 遍历的范围变成0~上一次有序的地方

优化3Code :

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	const int N=50;//这里你们随便 
	int n,a[N],pos,last;
	bool flag=0;//判断是否进行了比较 
	cin>>n;
	last=n-1;
	for(int i=0;i<n;i++) cin>>a[i];//输入
	for(int i=0;i<n;i++){
		flag=0;
		pos=0;
		for(int j=0;j<n-1-i;j++)//优化 
			if(a[j]>a[j+1]){//这里可以换成自己想要的符号,也就是升序和降序 
				swap(a[j],a[j+1]);
				flag=1;
				pos=j;
			}
		last=n-1-i;
		if(pos) last=pos;
		if(flag==0) break;
	}
	for(int i=0;i<n;i++) cout<<a[i]<<" ";//输出 
}

还有一种优化在前面优化的基础上,从头到尾遍历一次再从尾到头再遍历一次。这里就不放代码了,读者们自己写吧。

总结 :

冒泡是一个用处不大的算法,因为即使优化也只能优化常数,所以基本上没有人用。

相关推荐
2501_9248807012 分钟前
手机拍照识别中模糊场景准确率↑37%:陌讯动态适配算法实战解析
人工智能·深度学习·算法·计算机视觉·智能手机·视觉检测
lifallen1 小时前
HBase的异步WAL性能优化:RingBuffer的奥秘
大数据·数据库·分布式·算法·性能优化·apache·hbase
星期天要睡觉1 小时前
机器学习——支持向量机(SVM)实战案例
笔记·算法·支持向量机
Skylar_.2 小时前
嵌入式 - 数据结构:哈希表和排序与查找算法
数据结构·算法·嵌入式·哈希算法·散列表
破刺不会编程3 小时前
linux信号量和日志
java·linux·运维·前端·算法
汉汉汉汉汉3 小时前
C++中的继承:从基础到复杂
c++
科大饭桶4 小时前
Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具
linux·服务器·c语言·c++
黑色的山岗在沉睡4 小时前
【无标题】
数据结构·c++·算法·图论
2301_785038185 小时前
c++初学day1(类比C语言进行举例,具体原理等到学到更深层的东西再进行解析)
c语言·c++·算法
Dream it possible!5 小时前
LeetCode 面试经典 150_数组/字符串_加油站(14_134_C++_中等)(贪心算法)
c++·leetcode·面试