00:00
大家好,我是海波老师,我们继续来讲Java中的数组,我们这里呢,把它拷贝一下,然后呢,我们写上一个我们的下划线,一点击OK啊好了,然后呢,把里面这些东西啊,咱们全都去掉好去掉去掉以后把它改回去,我们叫做数组就可以了啊那么之前提到过宿组啊,它是连续的来保存数据,那么也就是说数主保存数据啊,它是有顺序的,而这个顺序呢,它就是数组的索引顺序,但有的时候呢,我们希望数组中的数据呢,是大小有序的,怎么办?比如啊,我们现在准备一个数据,我们叫int啊,给它一个numbers,等于一个大括号,大括号里面我们写上什么呢?叫一四,我们352,诶好了,我写完了以后,现在呢我循环去打印它点一下,诶好,现在呢,记住了,我第一个插进去,它就会放在我们索引为零的位置,第二个放进去就会放到我们索引为一的位置,以此类推,那么我们的所有数据都会有一个连续的下标索引,所以呢,我们去打印我们的number好了。
01:00
啊,我们会按照我们的顺序呢依次打印,所以呢,我这里打印一下,打印之后你会发现结果跟刚才的14352没有任何的区别,但是呢,我现在希望呢,我们获取到的数据是12345,怎么办?我希望啊获取到的数据是12345,诶这是不是就需要对我数组当中的数据进行一个数值大小的排序了,而不能按照我们的插入的顺序了,对不对?哎呀老师,那该怎么排呢?大家想一想,在生活中我们上学的时候,如果让我们做课间操的老师让我们排队,我们是怎么排的呢?我们是不是按照我们的大小个排成两排对不对?那么这种排队方式的时候啊,我们一般呢,会把那个班级里面个子最矮的同学把它放在排头对不对?没问题吧,然后后面的同学呢,就按照我们的身高一次排列就可以了,当然了,我们为了排队会快一些的话,我们一般会大概的判断一下我们跟其他同学的身高差,然后呢,有个大概的位置对吧?哎,我这只是举个例子呀给大家。
02:00
提供一个排序的基本的思路啊,其实啊,我们程序中也是这样的,我们现在呢,就准备用这种最简单的方式来实现这个排序的功能,而这个思路的核心呢,其实就是把所有数据中最小值或最大值取出来,放置在数组的第一个或者最后一个,哎,老师,刚才你不说了吗?把那个最小的放在排头嘛,大家想想生活中我们上体育课的时候,是不是应该是把身高最高的排在第一个呀,那么你做我们的课间操的时候,是把我们最矮的放在我们第一个对不对?所以啊,它不一样,但是不一样是不一样,是不是都能排序啊,所啊,我们这个不纠结我们到底怎么排,我们这里就用最简单的方式,我们把最小的放在左边,把最大的放在右边,我们从小到大就可以了,我们就按照我们的12345这种顺序啊,所以同学们记住了,54321也是一种顺序,但是我们这里给大家讲一下12345该怎么去做啊,诶那好了,我们现在数据已经有了,那我该怎么排呢?我们。
03:00
现在把这个排序的功能呢,我们先放一放,我们先把我们当前数据的最大值给我取出来,放在我们的最后,这个功能怎么做呢?也就意味着我们现在把这个需求咱们简化一下啊,咱们叫简需求,怎么简化呢?就是将数组中的最大值放置在数组的最后。我们不说了吗?我们要排列的就是从小到大,那现在我就把最大值放在最后,或者把最小值放在我们最前面都可以啊,哎,但是我们这里呢,就先取最大值放在我们数组的最后,诶咱们怎么放呢?大家想想,我们如果想要把我们数值中的最大值要想获取到的话,你是不是应该把每个值都得比对一下,比方说你这个值跟它比一下对不对,然后你这个值再跟他比一下,然后这个值再跟他比一下,你得挨个去比吧,你才能知道哪个值更大一些对不对,所以啊,咱们画图呢,给大家理解一下来,咱们这里画图的时候啊,咱们就往下拉好了,我们现在呢,把数据准备一下,咱们这里的数据不是14352吗?一二咱们写上它一四。
04:08
翻过来一四,然后呢,写上它我们的三,嗯,反过来。然后呢,我们的五,哎,拷贝拷贝一下来写上一个五,然后呢,写上一个二行了,写完了以后呢,我现在用一个东西把它包起来啊,绊述的是当前是一个宿主啊,诶放过来,然后颜色呢,给它个蓝色,然后呢,至于底层就可以了,当前这就是我们的宿主了,我就想从它里面找到我们的一个最大值,同学们我该怎么去找呢?其实我说过了,我要从里面找到最大值的话,我是不是应该每个值都比较一下,那我首先我就先比较我们的前两个值,我把前两个值准备比较一下,所以我这里呢,画上一个绿色。表示的是它们两个现在啊,准备开始做比较了,它们两个如果做比较的话,大家想想,我说过把最大的值放在我们的最后面,那它俩谁大呀,它俩谁大不就是四大吗?我相信大家一定能明白吧,所以来我们复制一下放过来,放过来以后我把这个四呢,我给它标记一个颜色,标记一个红色,表述的是它俩比较之后,我们的四是大的值,那这个一呢就比较完毕了,它比较完毕就不管它了,那么好,同学们,那接下来怎么办?
05:19
你接下来是不是应该拿这个值跟我其他的值比较,谁大谁小啊,所以我接下来呢,我拿我的四呢干嘛呢?诶我再跟这个山呢做比较,所以这个山呢,我画成一个绿色好了,你化成一个绿色之后,同学们那么三和四不就开始做比较了吗?那么比较了之后你就发现哟。我们的四大呀,那么四大的话,那么三就小啊,那小的话应该放前面,大的话放后面吗?所以我的这个时候干嘛呢?我们复制一下来,复制以后我颠倒他们的顺序,把它的顺序呢,给它颠倒一下,诶我们画过来。画过来以后,同学们把三和四呢,我颠倒一下,为什么?因为按照咱们的要求呢,我们是需要把大的值放在后面呢,所以把它A放在这边,那这样的话不就可以了吗?好,这个三呢,我们就已经给它比较完毕了,比较完毕之后,那么接下来干嘛呢?该我们和五来了,我们该和五做比较了,那么这个五呢,就变成一个绿色,它就表示的是它和四做比较。
06:17
同学们,它和四做比较,那还有啥说的呢?肯定是五大呀,所以他们比较之后,大家想一想,那是不是我们的这个五就变成红色了呢?哎,所以我们的五就变成了红色,它变成红色,它就不是我们的大的值了,所以它就变成了我的黄色,已经比较完毕了,比较完毕之后,那么这个时候大家想想,下一步是不是应该我们的二和五做比较了,所以我们的二和五做比较,2A和五,二和五做比较的话,那还说啥呢?那肯定是我们的五大呀,那如果是武大的话,他这个时候该干嘛呢?他这个时候就应该交换它的位置,对吗?所以把这个位置呢给他交换一下来。交换以后同学们,那么我的五是不是就已经放在了最后了,所以把二挪过来,把五挪过来,好挪过来以后,那这时候我再复制一下,复制复制以后我们的最大值就已经取出来了,那好取出来以后,我们前面的这个就变成黄色,大家有没有发现我的每个值是不是都做过比较了,为什么呢?1342是不都是黄色了,它都经过比较了,然后最后的这个最大值五不也取出来了吗?诶,这就是我们当前取最大值放在最后的一个基本思路,咱们先不要去完成一个整体的排序,我先把最大值取出来放在最后,这个我们该如何实现呢?同学们,我刚才呢,已经把我们的整个的过程用画图的方式梳理了一下,咱们再来简单的分析一下,你会发现我就是把我数据的每一个都循环了一遍,然后呢,我会把相邻的两个值做比较,判断谁大谁小吧,如果左边大右边小,我就要交换它的位置,如果左边小。
07:55
后变大就什么都不做,诶大家想想是不是这个意思,所以啊,我们这里的基本实现逻辑咱们这么写来,写上它,咱们叫for循环,我把当前的所有数据我挨个遍历一下,所以它等于零,I小于,我就把这个number的数量我拿过来,然后写上它,我们叫做点length,然后写上一个I加加,对不对?我这么写完了以后,同学们想一想,我刚才说过了,我是不是要把相邻的两个数据做遍利啊?
08:21
我们是,我是不是要把相邻的两个数据做比较啊,那我就要取出第一个值和第二个值呗,所以我就写上它,咱们叫做int,咱们叫做NUMBER1,它就等于我们的number s number s给他一个I,同学们第一个值我取到了,那我第二个值应该是谁呀?是不是它呀,它我怎么取呢?我们它是不是应该取下一个位置啊,应该写上一个一,或者写上一个二啊同学们这个能不能明白,一个是取当前的值,一个是取下一个值,那如果我取下一个值的话,那咱们循环就不能循环到最后一个了吧?同学们想想我现在要取我们的这两个的话,那么你想想我还能循环到这儿吗?你循环到这儿的话是没有下一个的吧,所以你是不是应该循环到这就可以了,你循环到这儿的话,是不是就有下一个,所以我这应该减去一个一循环的数量,我要减少一个一,对不对,所以我这么写就行了,你这么写完了以后,第一个数有了。
09:18
第二个数有了,那现在你就得比较一下了,这两个数谁大谁小了,所以if我们叫NUMBER1,它如果要大于我们的NUMBER2,什么意思啊?同学们说一下,咱们左边的数据它大于我们右边的数据,它应该交换位置啊,交换位置什么意思呢?将我大的值向后挪动吧,对吧?你得挪动嘛,所以从这个角度来讲的话,我的画图当中大家会发现我现在就需要交换它的位置,那当然了,如果你小的话,当然不需要了,如果你大的话是要交换位置,那怎么交换呢?就是把四变成三,把三变成四吗?那我怎么写呢?同学们,很简单,我是不是直接把咱们当前的这个number的I,它就等于什么呢?我们的NUMBER2吧?同学们,然后呢,我再把咱们的这个一干嘛呀,给它变成我们的NUMBER1是不是就行了?同学们,我这么写不就等于交换了吗?对不对?你想想,我的这个值变成了我的下一个值,然后呢,我的下一个值变成。
10:18
我当前这个值,这不就属于一种交换吗?哎,这样的话就可以了,诶老师啊,你这么写就行了,那好,接下来我们就把我们的这个数据啊,我们挨个的去打印一下,我把这个呢往后挪啊,把这个往后挪,往后挪之后现在呢,把这个去掉,我现在呢,咱们来运行以后看一看,看一看以后大家会发现我们当前的最大值是不是五啊,我是不是把五已经放到了最后,而且大家看一下我们当前的数据是不是应该是我们的13425啊,你再看我们的打印13425没问题吧,跟咱们刚才分析的这个过程是完全相同的。只是我们现在用代码的方式把我们刚才的这个流程我们给它写出来了啊,最基本的原则就是两两比较比较以后判断左边大还是右边小,如果左边大,那么好交换它的位置,如果右边大就什么都不做,诶就是这么一套思路,诶,老师啊,那你这样的话就行了吗?那当然不行了,对不对?我们现在是把最大值放置在我们数组的最后了,但是你要记住啊,我们还没有完呢,我们只是找到了最大值,把它放置在最后一个了,你其他的顺序不是还没有调整吗?哎,所以我们还要把剩余的数呢,给它排好顺序,那这个我们该怎么做呢?其实同学们这个应该也会比较简单吧,为什么?因为你刚才啊,是把五个数的最大值放在了我们最后,那现在大家想想,你是不是还剩下我们的四个值了,如果你把四个值当中的最大值放在最后,然后呢,你再把三个值的最大值放在最后,你再把两个值的最大值放在最后,你这样的结果不就形成了一个连续的顺序吗?也就意味着同学们看一看。
11:54
我当前呀,是把五个值当中的最大值我取出来,我放在了什么,我们的最后对不对,那么好,我放到最后以后,我缩小它的一个比较的范围,我把前面四个值的最大值我放在最后,那么同样再完成以后,我再把我们前三个最大值,我再把前两个最大值,诶同学们,你看到这个地方有没有发现规律呀,我们所谓的规律是什么?就是当我每一次找到最大值之后,我这个比较的范围是不是就缩小了。
12:25
也就意味着我们之前呢是五个,现在我们就不是五个了吧,应该是我们的四个吧,再去找到以后,我们再去什么呢?缩小范围,所以也就意味着同学们,我们接下来呢,把这个拿过来,我们写个for循环,For for循环以后我写上in勾,它等于零,然后呢,写上一个勾,然后写上numbers啊,点length,然后呢小勾加加,写完了以后你把这个放进去,为什么?因为我们每一次我们循环的范围是要减少的,什么意思啊,就是当你等于零的时候,我们所有的数据要找到最大值放在最后,当你等于一的时候,那么我们当前的这个循环就要少一个,对不对?诶,少一个,当你等于二的时候,我应该少两个,当你等于三的时候,我们应该少三个,所以我们这里的范围啊,恰恰就应该比它少几个嘛,对吧,你这是零哎,就是全部,你这是一应该少一个嘛,所以我减去这个勾就行了,同学们这个能不能明白,如果这个能明白的话,我们运行一下看结果,你会发现我们当前的数。
13:25
据就是对的,12345没问题吧,同学们这样的话,我就把我当前宿主中的数据已经排好序了,我们这里呢,就跟个水泡一样,它从我们的左边就一个一个一个最终浮向水面,所以啊,我们把这种排序的方式啊,我们称之为叫冒泡排序,冒泡排序。而实现这个冒泡排序的代码呢,我们就称之为叫冒泡排序算法。好了,同学们冒泡排序的基本思路啊,我们就给大家介绍到这里,这个大家自己下来呢,理解一下我们如何找到最大值,如何把它放在我们的最后,如何来缩小它的范围,这个大家好好想一想就可以了啊。
我来说两句