经典的冒泡排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
经典的冒泡排序
那我先来简单的讲解一下什么是冒泡排序。已经冒泡排序他的一个过程到底是怎样的,好吧。假设呢我们有这么几个数字啊,比如说16和25,9和90最后是23,我随便输了几个数字啊。那我们现在干嘛呢,要求他降序排列,降序排列,那什么叫降序呢?所谓降序的话呢,是从大到小。降序排列说白了就是从大到小,那你排数字的话呢,我们计算机肯定不能像我们人类一样,我们作为我们的正常人来讲的话呢,那你把5个数字排列,我一眼就可以看出谁最大谁最小。这是非常简单的,实际上这个过程对于我们人来讲的话,为什么简单呢?因为这个简单的话呢,他建立在我们从小到大一直训练的基础上的。那假设现在不是5个数字了,如果是一万个数字,或者十万个数字,要求大家排序呢,大家想,你能不能迅速找到哪个数字最大呢?很难找到对不对?所以对于我们来讲的话,我们要通过探讨这几个数字的这样一个算法,慢慢的,这个算法在数字变的比较多的情况下,实际上算法是可以通用的。我们是以小见大啊,那么在5个数字排序的话呢,他真实的步骤是怎样的呢?我们要排序,从大到小排序的话呢,实际上按照计算机处理的话呢,他是一个数字一个数字的去查找,进行交换的。所以呢说白了,冒泡排序的基础原理,是什么呢?是查找和交换,或者说这查找呢,会不是很贴切,换一个词,叫做遍历。遍历和交换。那什么叫做遍历呢,遍历就是一个一个访问,比如我先访问16再访问25,他的顺序是这样的,因为我们要从大到小排列,所以在第一次循环的时候,第一轮循环,要怎样呢?就是从大到小排列,左边的数字要求大,右边的数字要求小,那怎么样了?应该是把16和25进行比较,应该把大的往前挪,把小的往后挪,大家能够理解嘛?从大到小嘛,第一轮循环的时候,是某个数字如果小于后面的数字,那么就交换,大家看,那这个过程是怎么样的呢?第一轮呢实际上是16和25比较,如果某一个数字比后面一个数字小的话,那么就交换,所以应该是16和25进行交换,交换以后呢实际上就25 和16,但是第一轮完了没有呢?还没有完,因为你只是交换了前两个数字,后面呢仍然是9,90,23,所以在第一轮的时候,第一轮第一次的时候,实际上他的结果是这样的,紧接着第一轮第二次,第二次继续进行交换,我们再继续排,因为16还要和9相比较,16和9比较的时候仍然是这个逻辑,如果某个数字仍然小于后面的数字,那么就交换,那么16小于9吗?16肯定不小于9,所以第二轮实际上他执行交换了没有呢?实际上是没有交换的,好进行第三轮比较,相当于现在交换的顺序啊,这个顺序啊已经到9 了,对吧,击鼓传花,已经传到9 了,9仍然和90进行交换,9小于后面的90,所以这一次交换的话呢,是25,16,90下面是9,大家注意了,这个地方,最后一个仍然是23,第三轮比较的时候,泡泡已经落到这个地方来了,第四位来了,最后一轮交换的时候,9小于23吗?9是小于23的,25 16,最后一个23来进行交换,所以在第四轮比较的时候,他们发现在这一轮的时候,最小的数字就冒到了最后,而最大的数字呢,最大的数字暂时还没有冒出来,最大的数字应该在前面,那是第二轮进行循环比较的,所以我们探讨一下,首先冒泡排序第一个,需要比较多轮,因为你第一轮的话,没有比完嘛,第二个,第一轮比了几次啊?第一轮比较了4次,而这个4次的话呢,怎么来解释呢,4次大家想,为什么是4次呢,因为有5个数字,所以比较了4次。那为什么要比较4次呢,为什么不是5次呢,因为在比较第四次的时候,9这个数字最小值,已经到最后了,那你再比的话有意义没?没有意义了,因为已经比出来了对不对?所以第一轮,只需要比4次就可以了,而这个4呢,实际上是数组的总长度-1,这个大家刚开始进行理解,以后的话呢我们就知道了,5个数字第一轮比几次啊?比4次啊,大家看啊,从大到小降序排列,这个时候我们把数字竖起来看,这样会好看一些啊,应该是前面一个数字,从16开始比较,前面一个数字如果比后面一个数字小,就开始干嘛?16和25比较,因为16小,怎么办呢?就交换,对不对?那泡泡的话就冒到了第二层去了,
紧接着16和9进行比较,那16和9比的时候,他比9大,对不对?所以并没有进行交换,泡泡冒到了9这个地方来了,那9呢再和90进行比较,很明显9小于90,所以又进行了一次交换,最后泡泡到达9这个地方,又比他小,所以9继续往上冒,最上面的那个泡泡,其实就是他的极值,一共比了几次啊?一共比了4次,因为最后一次的时候不需要比了,泡泡已经在最上面了,这是第一轮,第二轮的话呢,第二轮继续从25和16比,一样的逻辑。前面一个数字比后面一个数字小,对不对?我就交换,这里的话16比90小,所以就交换。所以交换,继续,16比23小。然后交换,好了,现在呢一共比了几次啊。一共比了3次,第二轮比了3次。那么16到第二层的时候,到泡泡的时候,泡泡已经冒到16这个地方了,第二轮还要不要比下去了?不需要了,因为9已经是最小值了,16和9比不比其实都无所谓的。所以第二轮的话又比上一轮少了一次比较,第一轮比了4次,第二轮呢只是比了3次。那同样的第三轮呢?对吧,继续,只要小的就往上移,交换。到23这个地方呢,因为9和16
已经是极值了,所以这一轮他只是比较两次就可以了,那到第四轮的时候呢?只需要比较一次就可以了,这就已经成了一个有序的降序排列,那这就是冒泡排序。
我们继续总结,刚才呢我们总结了两个特点了,第一个是需要比较多轮,一共几轮呢?所谓轮数呢就是一样的数组长度减一,需要比较多轮,几轮呢?数组长度减一轮,对不对?那每一轮比较几次呢?第一轮比较了4次,第二轮比较了3次,第三轮比较了2次,第四轮比较1次。所以每一轮比较几次啊?每一轮比较几次啊,比较的次数比上一轮减一。对不对,每一轮比较的次数比上一轮减一,因为你第一轮比较的是4次,这就很简单了,所以第一轮比较的时候呢实际上是,数组长度-1次,对不对,这是第一轮。以后每一轮都比上一次减一,对不对?对不对,每一轮都要减几?你一共比较了当前次数当前轮数,是吧。大家可能最后一步当前轮数可能不是很理解。我们还是敲代码大家就理解了,这个逻辑的话大家先记录一下。冒泡排序的基础逻辑。然后我们使用这个程序把这个逻辑敲出来。这里的话呢,我给大家一些提示啊12 34 23 67 9这样的一个数组肯定就是无序的,在这是无序的时候,如果你再用冒泡排序的话,肯定是不能逆序的对不对?他直接给你排序了,因为我要逆序啊,那逆序怎么办呢?给大家一个思路啊,排序的算法就是,第一个元素和最后一个元素交换,对不对?第二个元素和倒数第二个元素交换。那这里假设一个元素的索引是i,那他对应的元素是几呢?思考一下。第一个元素是i的话,那怎么用i来表示最后一个元素呢?这里告诉大家就是n-i-1,这就是最后一个元素,那如果是第二个元素i,第二个元素仍然是n-i-1,就是说i=1的时候,这是几啦?这就是3号元素。对不对,所以他的一个公式就是这样的,实际上是第i个元素,第n-i-1个元素进行交换。是不是啊?我把代码写一下吧,这里有代码了,i=0,对不对,然后是i