数据结构--向量--起泡排序

起泡排序是通过反复遍历数列中的元素,依次比较相邻的两元素,如果前一个元素大于后一个元素,则将两个元素交换。这样数列中最大的元素会向后移动,在后形成一个由小到大的有序列。起泡反复进行,直到整个数列有序为止。可用下图形象表示:

如图,深蓝色为已拍好的有序数列,浅蓝色为正在起泡的无序数列,每循环一次,浅蓝色中最大的元素都会向深蓝色端靠拢。

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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值