00:00
下面呢,我们就把这一个。数组就是这一个数组有五个数据,把它进行一个冒泡排序处理好,现在呢,我们打开eclipse,我们新建一个包。新建一个包呢,我们就取个名字叫做sot啊,排序叫排序的一个内容,那现在呢,我们往下走。新建。新建一个类。这个类呢,因为是冒泡排序,所以说我取一个名字叫bubble。Short OK,把主方法给勾上。那现在呢,我们先把这一个数组拿过来,好吧,先把这个数组拿过来,这个数组呢,我们这样定叫int。等于什么呢?就用刚才我们在题里面给出的这么五个数。OK,好,这个五个数咱们就有了。
01:03
那么,为了让同学们能够。能够比较轻松的或者比较容易的听懂这个冒泡呢,这里我们给大家写一下这个冒泡排序的它的一个演变的过程啊,为了这样写啊,为了容易理解,容易理解我们干什么呢?我们。我们把这个把这个冒泡排序。排序的一个演变过程给大家,给大家展示一下,大家这个展示出来。那首先我们看到,我们首先看到我们刚才进行这个分析,分析我们第一趟是不是做这个工作。做这个工作OK,是不是第一次,我们说的第一就是第一趟排序,第一趟排序是干什么呢?是就是将最大的最大的。
02:00
就是将第一最大的那个,最大的那个数排在哪里呢?排在排在最后。是不是这个流程是如此这般的呀,大家看一下是不是一共要进行。第一,第一趟排序是不是要进行四次?进行四次这个比较。而且只能在变化,那其实这个地方就一个for循环就可以搞定,是这意思吧,所以说我们先完成第一趟排序,那我就开始写for循环了,那int I结吧,咱们写个结零。解,小于什么呢?是不是R?减一。节佳佳。是不是这个这个循环一共有几次,大家看出来了没有。是不是刚好是四次,因为你这个数组大小为五,五减去一等于四,那么零到四,四不包含,是不是一共进行四次比较,那么进行比较的时候是不是需要有个临时变量?
03:00
我把这个临时变量写到这里来,这个是一个临时变量。临时变量。OK,它用来干什么呢?用来做这个交换的时候有用,好现在我们比较,如果我们发现,如果我们发现前面这个数比后面这个数大,我们就交换,是不是这样说的啊,如果前面的数比后面的数大,则怎么样交换?如果不大呢,就不处理,那我就写上这句话啊。解,它如果大于二,解怎么样加一。大家理解这意思吧。好,这边我们可以把它格式化一下。能理解这个意思吧,如果前面这个数比后面这个数大,我们就交换,怎么交换呢?没问题,先让瑞杰。对不对,先把这个数据呢,保存在这个temp中,然后让。
04:03
姐。等于二加一。没问题吧,相当于说把R加一给到了R节,然后呢,RJ加一。J加一应该等于什么呢?Temp?是不是这样一个循环过后,第一趟排序就OK了,我们把这个打出来给他看一下。我们这儿输出一句话啊。说出一句话,就是第一趟。第一趟排序后。的这个数组,那这个时候呢,我们就直接输出就可以了,来我们输出一下当前这个数组长什么样子,我用A吐一下把这个数组。呃,转成一个字符串输出,那转成它。那我们看看这个时候如果没有问题的话,应该把最大这个数十排在最后了,那么我们运行一下,我们可以看到,诶同学们,我们看到是不是现在第十。
05:06
最大,从这个速度里面来看,是不是最大就放在最后了,没有问题吧,好,紧接着我们来按照这个推演的话,第二趟排序。同学们注意观察啊,第二趟排序,我们现在呢,在讲这个演变的过程,明白第二趟排序是不是把第二大的,把第二大的。第二大的。第二大的数排在那个倒数第二位。是不是排在这个倒数第二。第二位。那么这个东西又怎么处理呢?其实跟前面非常相似,你们有没有发现他是这样做的?来,如果我偷个懒的话,我把这个复制下来。怎么改一下就可以了,是不是他在比较的时候是。比较了几次,是不是比较了第二张排序比较了三次啊,那比较三次是不是就是那是减一再减一个一。
06:08
因为他扫了一次嘛,然后这里面代码有没有发生变化,没有发生变化,是不是相当于又重新走一圈吗?只是刚才已经排好的这个最大的数不再参与比较,所以说我就减了一个一。你这样处理完了过后,同学们想一想,是不是我们第二场排序?第二趟排序后的这个数组也看出来了,来看一下。有没有发现第二趟排序这个九。排在了倒数第二个位置。没有问题吧,但是前面仍然不是一个有序的,好,以此类推,同学们,是不是下一步我们要进行第三趟排序,又复制一次?第三段排序,我们进行一个简单的格式化。第三张牌序。如果是第三段排序,我们是把第三大的。第三大的这个数排在倒数第三位,注意啊,是倒数第三位。
07:05
OK,第三位,那这个时候是不是在这个基础上减几啊减二。大家看到已经是不是看到有感觉了,减二减二其他有没有变化,没有变化,因为你刚才倒数第二,呃,就是第二大那个数不再参与比较,所以说在原先基础上比较的次数再减一。那这些不用变化,所以说我们把这个第三趟排序后的数组又打出来了,运行一下我们发现呢,第三趟排序过后是不是三排在了倒数第三位。没有问题吧,那么这个时候其实负一和负二已经是最小,最大最小,但是你不敢保证,因为有可能它不是有序的,这是有有一种可能性的,对不对?假设我们这个负一原先不是负一,它是什么呢?我们给的假如这个负一是个呃,是个一,那你就。不一样了,对吧,所以说你仍然要进行第四次排序。
08:00
因为按我们这个思路,你一共有五个数据,你就要进行试探大的循环。能理解我的意思吧,啊好,现在呢,我们进行第四趟排序。第四趟排序第四趟排序就是把第四大的数据放在倒数第四位。那这个时候是不是应该减三?因为你又要少比一次嘛,这里面不做变化,因此第四趟排序。第四段排序过后,这个数组呢,其实跟前面一样,只是只是这个哦第哦对对对,刚才我们所说的还还不对啊,负负二确实是比负一小,所以说还刚好,呃,刚好这个这个案例还举得挺好,就是刚才负一和负二比较来说,负一是比负二要大一些的,所以说你看。这个这这个排序也证明我们的确把。呃,这个第四大的,嗯,把它挪到了倒数第四个位置,是不是啊,刚才我说的有问题啊,因为负一是比负二要大大的啊,刚才我们有。
09:01
这个呃,说的是有一点这个出入的好,那刚好这个算法理由证明我们在第四趟排序的时候呢,就把第四大的数排在了倒数。第四位。是不是,那这个时候还有没有必要进行第五章排序?不需要了,因为你统共有四个五个数据,你已经确定了四个数的位置,自然最后那个数不需要排序。好,同学们,看我们这样写,你们有没有发现它已经有规律了,什么规律?大家看for循环其实都是一样的。For循环都是一样,只是哪哪个在变化呢,同学们看。你这个能是减一,如果我写的再明白一点,是不是减零的感觉。减一后面没有减,是不是相当于减零,那这个地方是减,第二趟排序是减一,第三章排序是减二,第四趟排序是减三,看出来什么特点没有?
10:00
实际上整个这个for循环,我们可以把它。包起来,因为你这里代码,你看这个for循环,这个for循环,这个for循环啊,我们一共有有四个这个for循环是吧,就是从这开始的第一个第二个第三个第四个,其实这四个for循环。除了这个变量不一样,其他。都是一样的。因此我们其实可以把这个复选包起来就可以了,那大家看我的代码。我现在呢,就要开始。把它包起来。我们发现。后面的代码其实是完全。相同的就是出了一个变量不一样啊,我把这个删掉,然后在这个地方呢干什么,我用一个循环把它包起来。大家看我的演化过程就来了啊,注意听,For循环in it等于零。等于零。那么I。
11:01
小于一共几次?同学们,是不是2.n减一。是不是这么多吃的比较哎。加加。哎呀,家把谁包起来呢?同学们,整个把这一大串咱们包起来。看到没有,包起来,包起来以后,包起来以后,嗯,这个临时变量呢,咱们可以把它拎出去。因为它下面也要用嘛,然后这个地方这个零变成什么。变成I就可以了。因为你第一次循环进来过,I是零,第二次循环过来,过来就是I是一,再循环一次I是二,以此类推,最后最后这次进来的是多少呢?最后这一次进来的是不是,呃就是呃嗯,五五减去一个一,四最后一次进来这个I等于三。是不是样子的?好,那这样子呢,我们把这个第几趟排序呢,用一个变量给他重新处理一下加加。
12:05
第几张排序啊,是不是刚好是用这个I可以来控制加一就可以了,大家看代码能看懂吗?代码就写完了,也就是说我们其实原来写了那么多步,最后呢,用的是一个for循环搞定,同学们可以看到此时此刻有发现我们这一个,呃,就是冒泡排序它的时间,它的时间复杂度应该是什么样?应该是相当于N乘以N,就是N的平方。这个大家能看出来了吗?因为你是一个双层的嵌套循环。时间复杂度就是这样的一个东西,好,我们运行一下看结果对不对。哎,我们发现呢。跟我们讲一样,看第一次把十排过来,九。三。负一。没有毛病吧?完全的正确啊,完全正确,好同学们,那么我们这一个就是冒泡排序的一个最基本的代码就写完了。
13:07
最基本的代码就写完了,那么思路也给大家展示的比较清晰啊,这个D排序啊,这个就是。呃,这个这个地方就咱们就不能写成这句话了。这个就是冒泡排序,直接写个冒泡排序啊,冒泡冒泡排序。的时间,时间复杂度。是不是两个for循环啊就完事了,那么待会儿呢,我们,呃,刚才是不是也分析过这个代码里面也有可能存在。在第二趟的时候,就有可能已经是一个有序的了。那是不是我们对这个代码还要进行适当的优化呀?那么对于代码的优化,还有这个代码的整理呢?我们放在下一个视频为大家讲解这块大家先把它理解清楚,我们要求大家可以干什么呢?自己自己不看老师的代码也能写出来,因为面试的时候。
14:05
面试或者笔试的时候,别人直接让你在一个纸上写出来,明白好,那关于。冒泡排序的第一个代码实现就给大家先讲解到这里。
我来说两句