00:00
大家好,我是海波老师,我们继续来讲Java中速度的排序,那么之前给大家讲解了一个关于速度排序的一个冒泡排序算法啊,那么其实啊,基本思路呢,就是从所有数据当中找出它的最大值,然后呢,将最大值呢放置在咱们数组的最后,接下来呢,缩小数组的查询范围,再去找他们的最大值,再给它放在最后,以此类推,最后就完成了整体数据的一个排序,那么这个排序的方式我们说过了,它就好比啊一个水泡从水底呢浮向水面的过程,所以呢,它称之为叫冒泡排序。但是啊,这有个问题,什么问题呢?大家看一下,如果我假设啊,我现在拿到了我的数据来复制一下。复制了以后,我们现在呢,把这个颜色呢,我变成白色,然后呢,把这个五呢,我们给它复制过来,好复制,复制过来以后它变成一,我现在假设什么呢?假设我当前的这个五是个最大值,对不对?那么你在比较的过程中就会出现一个问题,同学们看一下来这个五,这个五呢,你会首先跟我们的这个什么,我们的这个四做一个比对,比对完以后交换一下,交换完了以后呢,你再跟这个三做比对,你再去交换一下,你再跟这个一再做比对,你再交换,再跟我的二做比对,你再交换。
01:13
有没有发现同学们你的这个过程没有问题,但是你数据是需要频繁的交换呢,会感觉就有点儿复杂了吧,能不能不要这么频繁的交换呢?所以接下来呢,我们就给大家介绍一种排序的这种算法,它就可以减少咱们交换的次数,这种排序的方法呢,我们称之为叫选择排序,好了,我先把数据呢,咱们恢复一下,我先改回去啊,然后呢,写上它,把这个呢我放回来,然后呢,把这个改成啊,把这个去掉。啊,把这个改成它啊,来,我们写上这个一不要了,把它写上一个五啊,颜色呢,变成我们的白色可以了,这个呢,就是我们当前的数据,这里呢,我们就写上啊,咱们叫做选择排序,什么叫做选择排序呢?其实很简单,就是说我现在从我当前数组当中啊,我随便选一个数出来,当成我的最大值,所以呢,我就假设我的第一个啊,咱们假设这个一,它所在的位置就是我的最大值,所以我这里给他一个红色,然后呢给他一个零,这个零啊就是最大值的索引啊,所以A给它放过来,我们这里呢,也给它写上,咱们叫max。
02:20
Index,好了,这个表述的是一个最大值的索引,那我说了,我假设一是我的最大值,所以我加上一个箭头指向这个操作就可以了。我指向它以后,现在我准备开始比较了,我比较的时候,同学们看一下我的这个四呀,和一开始要做比较了,哎,为什么这个四和一开始要做比较了呢?因为我们现在就把一当成最大值了吗?那我就发现,哎哟,这个四好像比一大呀,如果我们的4比1大的话,那么最大值的索引就不再是我的零了,应该是我的一了吧,所以我们的第一回比较之后,同学们会发现我当前最大值的索引应该变成了什么,我们的一了,所以这个箭头就指向了这个位置,对不对,那么它就没有关系了。好了,那么你这样做了以后,我接下来是不是该四和三做比较了,所以我们复制一下我的四和三做比较,那我的四和三做比较的话,不用变为什么,因为本身我的四就是大的,所以这个值是不用变的,它如果不用变的话,好,我们再来复值。
03:21
这个时候我们的箭头就应该改变它的方向了,应该是什么呢?我们的四和五做比较了吧,应该他们俩做比较,它们俩做比较,同学们想一想,那是不是五大呀,如果五大的情况下,那么四就已经不再是最大值的索引了吧,所以它就应该改成叫0123,所以同学们我们比较之后,我们就应该复制一下,复制以后它就应该变成几了三了,对不对?它变成三了以后,这个箭头应该指向的是这个位置,这个箭头也就没有了。它没有了以后,是不是该五和二做比较了,所以我们的箭头五和二做比较,五和二做比较的话,同学们想一想,那么五和二的话肯定还是五大呀,这个值用变吗?不用,它不用变的情况下,那么我比较的最后结果其实还是我当前的30,最大的就意味着我当前的这个五啊,它就是我整个数组当中最大的那个值,没有任何的问题,哎,老师啊,那现在你把这个值找到了以后,你干嘛呀?我找到了以后,我是不是只需要把我最大的这个值跟我最后的这个值做个交换就行了,同学们想想是不是这么回事。
04:26
你把这个五跟我最后这个二一交换,我们当前的这个结果不就出来了吗?诶大家看看那么好,我们去交换一下,来复制,复制以后你把这个五跟我的二交换一下,你交换以后,那么说明我的这个值不就取出来了吗?取出来了以后,这个箭头我再重新来把它改成零,啥意思,缩小范围再来一遍呀。对吧,这不跟咱们之前那个冒泡排序就一样了吗?我们找到了最大值,放在了我们的最后,我要缩小范围,再走一遍这个逻辑啊,哎,但是你会发现我们交换的次数好像只有最后一次交换了吧,前面的整个过程只是改变了索引,并没有做交换,对不对?同学们,这个大家能不能明白,如果能明白的话,我现在把这个过程给大家写一写啊,来咱们拷贝。
05:17
把这个呢,我们复制一个新的代码,来把这个写上一个二,咱们点击OK,然后呢,把里面的东西啊,咱们全去掉,咱们全不要了,不要了以后呢,我写上它啊来咱们写上它,咱们叫做选择排序,那么选择排序的时候我说过了,我们首先我们要找到我们的什么最大的那个索引呢?咱们叫max index,我们给个零,我就假设呀,咱们的第一个值就是最大的,所以它的索引就是零了。那好了,我们写上一个for循环,既然我选择第一个了,同学们,那咱们应该从第二个开始比较吧,所以咱们的I它等于一,然后I小于numbers点单,对吧,然后再写上一个我们的I加加就行了。写完了以后,大家想想,什么时候我们才要改变我当前的这个索引呢?咱们来分析一下什么时候改变,是不是当你和这个值做比较的时候,你判断两个值谁大谁小啊?
06:10
哪两个值谁大谁小啊,是不是当天你循环的这个值跟你最大的这个索引的值做比较呢,对不对?同学们想想是这么回事,哎,所以啊,就是说我要判断一下我当前的那个值,咱们叫numbers,给他一个I和什么呢?你当前的那个最大值,索引的那个值,判断谁大谁小,如果你当前的值比你最大索引的那个值都大,那说明最大索引就不是它了,那所以呢,我们就写上叫max index,它就应该等于什么,应该等于我们的I了,哎,就那么简单。所以当你全部循环之后,你就发现最大值的索引你已经拿到了,那么你拿到了以后怎么办?同学们,你只需要和最后一个值交换就行了呀。怎么交换?同学们很简单呀,你把二给五,把五给二不就行了吗?所以同学们,咱们这样,你把我们当前的最后一个值numbers,你写上numbers减1A,把它拿过来写上,写上一个int,咱们叫做NUMBER1等于它,对吧,你把这个值取出来,取完了以后,你再写上一个二,你再把这个main death,你再把两个值取出来好了,取完了以后,那么这个时候你就要想一下了。
07:22
我是不是应该把我们当前的最大的值变成什么,我们的最后一个吧,对不对,诶就是它了,然后呢,再来把我们的最后一个变成我的最大值嘛,所以把最后这个值,诶把它变成我们的当时最大的值嘛,所以你这么写不就可以了吗?同学们,所以啊,我现在的这个逻辑就完成了最大值的选择呀,那好,我们来运行一下,我们看一看,所以呢,我们这里写上它,咱们叫numbers,点我们的for循环,For循环以后把每个值我打印一下,叫做number,现在呢,我们运行运行,看结果运行。运行以后14325没问题吧,同学们,我的这个五是不是把最大值挪到了最后了,好,挪完了以后,我开始要缩小它的范围了吧,缩小它的范围我们写上一个for循环来吧,我们叫做in,它勾它等于零,然后呢,勾我们小于numbers,点我们的LAS,然后勾加加就可以了,写完之后我把下面的这些代码呢,我原封不动的给我拷贝进去。
08:27
啊,拷贝进去以后,但是你要注意了,你每一次循环之后,你的范围应该减去当前的这个次数,所以说我应该减去我们的勾,同样道理,你的位置呢,也应该发生变化,我应该减去勾,我这里也应该减去勾,其实就行了,同学们,我现在就把当前的选择排序已经写完了,来我们试一试啊,咱们运行一下,看结果运行。运行以后你会发现我们当前的结果应该是没有问题的,12345,所以啊,我们整个选择排序的重点就在于选择,我们选择其中的一个值当成我们最大的值,然后呢挨个跟其他的值做比较,最后找到最大值的那个索引,然后呢让它跟我最后一个值做交换,交换以后再缩小范围,按照之前的逻辑依次呢去进行查找就可以了。
09:21
所以啊,这个思路只要大家明白,自己下来写一写,应该问题也不大啊。
我来说两句