本篇文章主要讲解C++排序算法中的冒泡排序(Bubble Sort)。
一.冒泡排序简介
1.定义
顾名思义,冒泡排序意思是就像泡泡一样从底层通过两两相邻的元素交换位置上升到最顶层,其实,冒泡排序可以称作"交换排序"。
2.原理
1).根据一个序列,比较两个元素,如果顺序不对就交换(由大到小或者由小到大)。
2).依次遍历n个点,一次找出一个最大(最小)值,进行n次,完成排序。
总结:冒泡排序就是通过两两相邻元素进行比较,每一轮找出最小或者最大值,然后循环n轮,结束排序。
二.冒泡排序实例演示
void PrintArr(int a[],int n);
void Bsort(int a[],int n);
void Bsort(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j+1]<a[j])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
}
void PrintArr(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
}
int main(){
int n,i,a[10];
cout<<"请输入数组大小(元素个数):"<<endl;
scanf("%d",&n);
cout<<"请依次输入元素:"<<endl;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
cout<<"排序前:"<<endl;
PrintArr(a,n);
cout<<"\n"<<endl;
cout<<"排序后:"<<endl;
Bsort(a,n);
PrintArr(a,n);
cout<<"\n"<<endl;
return 0;
}
结果:
分析:输入数组大小,然后依次输入元素,通过冒泡排序进行排序。
直接看代码可能对于初学者很难理解,下面我将详细演示步骤
通过冒泡排序函数详细讲解:
以上面输入的元素分析
1).输入3,3,1,2,5,4,由冒泡排序的原理可知,每一轮排序都会找出最大或最小的元素,所以,找完所有元素就需要n-1轮。
第一轮:3,3,1,2,5,4(开始):i=0,j=0时,判断a[1]和a[0]=3,不排序,此时顺序为331254,j=1时,a[2]=1<a[1]=3,排序,顺序为313254,j=2时,a[3]=2<a[2]=3,排序,顺序为312354,j=3时,a[4]=5>a[3]=3,不排,顺序为312354,当j=4时,a[5]=4<a[4]=5,排序,顺序为312345,第一轮结束,找出最大数为5,移至最右,且下次排序不会再排a[5]。
2).第二轮:312345(开始),i=1,j=0,a[1]=1<a[0]=3,排序,顺序为132345,j=1,a[2]=2<a[1]=3,排序,顺序为123345,j=2,a[3]=3=a[2]=3,不排序,顺序为123345,j=3,a[4]=4>a[3]=3,不排,顺序为123345,第二轮找出最大数为4,且下次不会再排a[5]和a[4]。
3).第三轮:123345(开始),i=2,j=0,a[1]=2>a[0]=1,不排序,顺序为123345,j=1,a[2]=3>a[1]=2,不排序,顺序为123345,j=2,a[3]=3=a[2]=3,不排序,顺序为123345,第三轮找出最大数为3,且下次不排a[5],a[4]和a[3]。
以此类推直至最后一轮。
可能很多人发现,在第三轮就已经排序结束了,程序还是会继续排序,此时的冒泡排序时间复杂度为O(n^2),那么,我们可以增加一个标记:在上轮如果没有进行排序,则说明程序已经排完了,就直接跳出循环,稍做修改如下:
void Bsort(int a[],int n)
{
bool flag=false;
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j+1]<a[j])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
flag=true;
}
}
if(flag==false)
{
cout<<"已经排序完成,不再进行后面排序"<<endl;
break;
}
}
}
实验一下已经排好的顺序
结果:
再试一下未排序的顺序
结果: