简介 :
冒泡排序(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]<<" ";//输出
}
还有一种优化在前面优化的基础上,从头到尾遍历一次再从尾到头再遍历一次。这里就不放代码了,读者们自己写吧。
总结 :
冒泡是一个用处不大的算法,因为即使优化也只能优化常数,所以基本上没有人用。