起泡排序是通过反复遍历数列中的元素,依次比较相邻的两元素,如果前一个元素大于后一个元素,则将两个元素交换。这样数列中最大的元素会向后移动,在后形成一个由小到大的有序列。起泡反复进行,直到整个数列有序为止。可用下图形象表示:
如图,深蓝色为已拍好的有序数列,浅蓝色为正在起泡的无序数列,每循环一次,浅蓝色中最大的元素都会向深蓝色端靠拢。
2.代码实现
#include
using namespace std;
void swap(int &a,int &b )//交换两元素的值(注意要用引用哦)
{
int temp;
temp=a;
a=b;
b=temp;
}
bool bubble(int *A,int lo,int hi)//起泡
{
bool sorted=true;//假设数列有序
while(++lo<hi)//自左向右,逐一检查各对相邻元素
{
if(A[lo-1]>A[lo])//如果逆序
{
sorted=false;//假设不成立
swap(A[lo-1],A[lo]);//交换两元素,使其有序
}
}
return sorted;
}
void bubbleSort(int *A,int lo,int hi)//反复起泡,直至有序
{
while(!bubble(A,lo,hi–));//当未全序时,继续起泡
}
int main()
{
/测试起泡排序**/
int a[10];
cout<<“测试数列:”;
for(int i=0;i<10;i++)
{
a[i]=9-i;
cout<<a[i]<<" ";
}
cout<<endl;
cout<<“bubbleSort后:”;
bubbleSort(a,0,10);
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
/******************************/
return 0;
}
运行结果:
3.代码改进
大家想一想,起泡排序是对数列进行反复的扫描起泡的,扫描的次数是数列的元素个数n。每次扫描检查的元素个数随着扫描次数的增加而减少,那我们可不可以让其减少的更快呢?答案是,视情况而定。如果数列是存在部分由于的,就可以。来看下面的一张图,让我们更好的理解:
我们设深蓝色部分是有序的,浅蓝色部分是无序的。如果对于这样一个数列,我们可以想办法让扫描忽略那些已经有序的数列区。这样可以提高一点效率。
代码实现:
int bubble(int *A,int lo,int hi)//起泡
{
int last=lo;//改进处(用last记录最后一个逆序对的位置)
while(++lo<hi)//自左向右,逐一检查各对相邻元素
{
if(A[lo-1]>A[lo])//如果逆序
{
last=lo;
swap(A[lo-1],A[lo]);//交换两元素,使其有序
}
}
return last;
}
void bubbleSort(int *A,int lo,int hi)//反复起泡,直至有序
{
最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
,直至有序
{
最后
给大家送一个小福利
[外链图片转存中…(img-gZupif3u-1720112318590)]
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
[外链图片转存中…(img-tQXERuFB-1720112318591)]