C语言的学习历程3(冒泡排序)

刚开始接触排序的时候想了好久才想出来这么个玩意

后来一直得到这个结果 

我百思不得其解,后来问了学长才知道,自己的逻辑出了点问题 ,如果有负数,它就不能正常排序了,学长说这也和一个排序有点相像:选择排序,我来先解释一下这个原理(虽然和这篇文章没啥关联,只是为后文铺垫)上面大循环表示循环了九次,也就是前后比了九次。因为我本来想的是让第一个数和所有其他的数比如果有比第一个大的就和他换位置,从而确定了最大的数,然后剩下的数继续按刚刚的方法比,从而确定了剩下的数的大小位置,而当确定了倒数第二个数的大小位置后,最后一个数的位置也就随之确定了,所以我们的大循环的次数为要比的数减一;解释一下为什么这个int max放在大循环之内小循环之外,这是由于我每比一次就要重新确定最大值,所以每确定一个最大值就要在下一次比之前重置max。其实我之前一直不明白这个求最大值的代码:现在顺便提一下看看这串代码,刚开始学程序的我,看见这第二十七行我就迷糊;其实自己模拟了才知道:刚开始我们把max定义为数组里的任意一个就行,这里我设为a[0]这里顺便再提一下,在很多题目里面,其实用max或者min的话就会出错,算不出来,所以有时候还是尽可能地取他们这串数字的极限。至于为什么容易出错,我们后续再说。;当i=0时判断a[0]=a[0]不满足所要求的条件,i++进行下一次循环,判断a[1]<a[0],不满足跳到下一次循环,以此类推当到a【2】时大于a[0]进入if语句此时max变为了a[2]=4;也是说只要是有更大的数就会被max取到,所以这个代码才可以求最大值。现在继续回到代码,可以看这个小循环里的i=j的含义,你可以来看,我们因为我们确定的是前面的数字:先确定最大的放第一位......,一旦它的位置确定就不要比了所以我们可以依靠次数的增加,来把比的数字位数进行后移,而如果找到了最大值,则把它的标号记下来。我们先上代码(还是之前那题)

刚开始我学这个冒泡排序的时候:听了一下原理,看一下代码觉得自己都懂了,就睡了,第二天遇到用冒泡排序的题,还是漏洞百出(这说明学完之后巩固很重要)下面我来总结一下自己刚开始不理解的地方和易犯错的地方:

1.刚开始我不理解第10行为什么是9-i;甚至在想十也没毛病呀!知道我一个一个去试才发现原来如果是<10的话最后的j+1将会是10也就是a[10]我们知道数组中是从a[0]开始命名的如果是十个元素最后一个的应该是a[9],而不能是a[10];而这个i的话讲太多也不如自己试来的明白,可以试着把i=0;开始试直到循环结束。

2.还有就是我之前对于交换一直都不明白,经过好久才理解现在我把我自己的记忆和理解方法归纳给陌生的你,希望能早日帮困扰的你度过难关:

如果两个数组元素要交换值的话:如a[i]和a[j]要交换值的话:

可以设置一个中间变量t:首先我们要了解赋值运算符将一个常量或表达式赋给一个变量;也就是说a[i]=a[j]表示的意思是将a[j]的值赋给a[i];代替了a[i]的值但是a[j]的值不变;所以     我们来分析这段代码    t=a[j];            表示把a[j]的值赋给了t,当然a[j]的值不变,而且还有一点要注意的是,在这个表达式(指的是t=a[j])之后如果a[j]的值改变了的话,t的值还是原来的a[j],而不是现在改变的a[j],                                                 

                    a[j]=a[j+1];

                     a[j+1]=t;

上面a[i]=a[j];的式子也是这样运作交换的;后面的就容易理解了,在这里我分享一个记忆的方法,就是:我是借用变量t,所以开始应该是变量t,做人应该有始有终,所以结束还得是变量,而另外两个变量要连一起,所以就变成了这样

 3..我刚开始尝试自己打冒泡排序的代码时还犯了几个错误,

当然这是正确的代码,我是刚开始把第十行的j=0写成j=i+1后来程序运行结果错误,我想为什么不可以呢?后来才知道原来如果是i+1的话就少算进了一个a[0],因为我们这里比的是a[j]和a[j+1],而之所以要这样比,是因为冒泡排序的原理,可以自己理解一下。后来我把原来的改为j=i;又运行还是错的其实这里是因为随着i的增大i变得越来越大,而我们是要需进行从小到大,我想难道是因为我这个代码是通过每一次i的循环来确定最小值放在后面,而随着确定的越来越多之后,比较的就越来越少,后面的数都比不了了,超出了范围如j=i=5,而j<9-5=4,不符合要求就会自动跳出,所以得到的结果也就不符合要求,而后来我就想,如果这样不符合要求的话我把条件改一下不就行了吗,于是我把j<9-i改成了j<9,这样还是错的,因为每次比完一轮i后沉淀的是最后一个数,而如果这样的话每次我们前面的数都要比,而这个代码就少比了前面的数,其实无论是j=0;j<n-1-i还是j=i;j<n-1其实都可以,只是要看你排序的顺序。可是这个代码还有个特色:它的运行结果是这样的:

稍微模拟一下冒泡排序的第一波

 

4.所以每次写排序的时候都要先理清思路,属于那个排序,不然非常容易混。在这里小小总结一下选择排序和冒泡排序(选择排序i个数字和每个数字比找最大(小)值,然后符合有关条件的交换,而冒泡排序则是第1个第二个比第二个和第三个比,以此类推,逐渐沉淀。)

毕淑敏曾说过:”你不可能要求一个没有风暴的海洋,那不是海,是泥塘。“愿我们的未来在充满挑战的同时也能有敢于斗争的自己。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值