数据结构--向量--起泡排序(1)

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)//反复起泡,直至有序

{

while(lo<(hi=bubble(A,lo,hi)));//当未全序时,继续起泡

}

我们对bubble函数与bubbleSort函数做如上修改,便可达到目的。需知道last是用来记录最后一个逆序对位置的,如果最后一个逆序对比较靠前,我们就赚大发了,下次扫描就可以减少很多不必要的检查了(last后的都不需检查是否逆序了)。我们还应该知道此代码中的while(lo<(hi=bubble(A,lo,hi)))与未改进前代码中的while(!bubble(A,lo,hi–))的执行次数是一样的,都是数列有序就立马停止。

4.在向量模板中实现


//扫描交换–"bubble"函数

template

bool myVector::bubble(Rank lo,Rank hi)

{

bool sorted=true;//整体有序标志

while(++lo<hi)

{

if(_elem[lo-1]>_elem[lo])//自做向右,逐一检查各对相邻元素

{

sorted=false; //逆序

T temp;//交换

temp=_elem[lo-1];

_elem[lo-1]=_elem[lo];

_elem[lo]=temp;

}

}

return sorted;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
必备的redis视频、面试题和技术文档**

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

[外链图片转存中…(img-uWZPRxvY-1713712554008)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值