00:00
班,呃不是基础班最最难的一个例子,也不能说最难的一个例子,就是最重要的一个例子,就是什么呢?叫冒排序,是我们讲到算法的时候,就是后面讲什么数据结构,就不是像咱们前之前讲什么数据类型是吧,是数据结构里常用的一种什么一种算法叫排序算法,这个算法很常用,比如说什么,比如说我们在淘宝上购物,购物的时候,这里面会有什么很多选项,是不是,比如说按价格排序,就是从低到高排序了吧,是不是按离我的远近,比如说这个在北京呢,是不是在那个什么浙江浙沪的是不是,这里面是有远近之分的,它都能怎么都能作为数据的一些依据进行什么呀排序是不是,那他就这里面,比如说这里数,呃,数据里面存了很多东西,就可以拿来排序,就像成绩一样,比如说考试出来了之后,那我们这里面可以怎么样从高到低进行一个排序,是不是第一名,第二名,第三名,是不是这样都可以排序啊,在我们的这个工作中用的很多,所以这里面讲一种方式叫。冒泡排序,那我们这里面看一下啊,先新建文件,然后再去看一下这个例子是如何操作的。是零八冒泡排序这个一定要会啊零八。
01:05
冒泡排序。点C。井号一,那我们去先看一下这个是一个什么样的模型啊,那我们再拿回来这样一组数据给大家看一下,这是保存,嗯,保存一下。新建一个。PC呢,PC在这呢,找不到未来,然后。不用。替换了是不是啊。奇尿呢?这家没了,这块没了。完了。来砍这回来吧。追也追不回来了。保存了刚才。那我们自己洗漱吧,然后耽误大家点时间啊,你也别着急。哎,这写书我也不好写啊。先在变之后,我们粘贴到我们这个界面中给他,这个是删掉。黄佳薇啊,张贴过来。
02:01
我们把数切出来一组。啊,展现过来,假如这是一个什么我们称为叫无序的数据,什么叫无序啊,没有给它排序之前那个数据是不是,那这里面是不是一个数组啊,就相当于我们来写一下啊,是一个整形的数组,Int类型的AR,然后是。几个九个吧,应该是等于什么等于这个是。四逗号二逗号八逗号零逗号五逗号七,逗号一逗号三逗号九是不是这样的一个什么这样的一个是。数组啊,我们要对数组进行一个什么操作,就是排序操作,那怎么操作啊,这里面是多少个值,看一下是九个值,九个值之后我们要比对的时候,比对哪个,比对是它和它相邻的两个元素进行比对哪个啊比如说这是。第一个元素和谁呀?和第二个元素进行比对。比对出来之后,我把大的放在后面,把小的什么放在前面,那这里面比对完成之后,那我这里面需要怎么样,需要给它换一下位置,应该怎么换呢?
03:06
如果说大的就往后排,小的就怎么样往前放,那就怎么样,下面下面执行完一次之后,应该是这样的,复制一个,然后给它放在什么,放在它的。下面,然后这个怎么样复制一个给它。放在这下面这俩元素交换一下位置,交换位置,咱们刚才讲的数组这个呃,逆置的时候是不是就交换位置了,做一个临时变量给大家去交换一下,然后开始去操作什么操作是这个,呃四就是现在光标,现在光标位置就是在哪啊,就是原先第一个时候去交换他跟他后面一个,现在第二个的时候,那应该交换哪两个。四和八了吧,四和八比对一下应该怎么是交换一下位置吧,啊不用交换位置吧,因为怎么,因为这个是八大,所以说八这里面不用交换位置啊,把这个怎么着,呃复制一下拿过来。放在我们这个下面。然后八跟零情况下需要交换位置吗?需要是吧,大的怎么往后,小的往前,这里面交换一下啊,现在光标怎么的,光标移动到哪了,移动到这儿了吧,应该是嗯,那下次移动到这先在这儿呢啊,然后把这个切换过来,把这个。
04:07
零诶。给复制一下吧,CV复制一下拿过来。然后光标怎么样,光标往下走了,光标走到哪了,光标走到下一个位置,然后这里面比对哪个,比对八和五进行比对,是不是需要换位置吗?需要吧,呃,需要换位置。往后挪一下,把这个五。复制。拿过来一份,放在这儿。然后光标继续往下走。然后这里面八跟七需要交换位置吗?需要把这个往后挪一下,然后把这个怎么着是。弄过来一个放在这这中间,然后呢,然后光边是不是继续往前走啊,八跟一需要交换位置吗?需要那把这个八往后再挪的位置,然后把一。拿到哪来,拿到这块来。然后他还怎么着,还继续往下走是不是,然后八跟三需要交换位置吗。
05:03
需要把八再怎么样往后挪一个,然后把三给他。放在这儿。然后八跟九需要交换位置吗?不需要,那我们这个怎么着光标诶。我把光标怎么着往后挪一个位置挪到这儿了,是不是,然后八跟九。我把这个复制一下啊,CTRL加CCTRL加V复制一下。那现在为止,我经过了这一轮计算之后,我获取了一个值,哪个值是有效的?八有效九有效啊,九有效是吧,八都不一定有效,但是九一定是怎么一定有效的,但是你看一下我这个指针执行到哪了,不是这个数组下标执行到哪了。是直行到这还是直行到这儿啊,八,这是不是我这里面几个数啊,九个数九个数如果两两比对的情况,是不是应该比对八四就可以了,是不是,那我们再再把这话重重复一遍啊,是如果九个数两两比对的情况下,是不是应该比对八次就可以把九个数全部比对完成了是吧?是不是你再回忆一下这个问题啊,就相当于比如说这一排几个人,123456个,是不是找一下最高这个他俩一比,他俩一比谁最高谁站起来是不是,然后他俩再比谁最高谁站起来是不是,然后他俩一比谁最高谁站起来,然后这个最后比完之后,我一定能获取一个最高的是不是最高的出去,呃,不是这个,这个不是这样,最高的站在我旁边是不是,其他这几个人再比,再拿出个高的是不是站我旁边就可以了,经过这几次比对之后,才能得到全全部的这个什么呀人啊。
06:31
从方到第是不是这里面是六,六个人是不是刚才说的啊,六个人比对的情况下,这里面是不是应该比对几次啊,比对五次是不是就可以了啊,这里面每次循环之后,我就能确定什么,确定一个最大值是哪个是九是不是最大的啊,九最大的那我们用红色圈圈给它框起来。那我下次再比对的时候,还需要比对这个九吗?不需要了,是不是因为九已经最大了,那我可以把它单独提出来,就放在后面就行,下次我再执行的时候,就应该这个循环的时候就应该循环几次了,现在是几个数啊,现在是九个数了,我下次循环的时候是不是应该再循环八,八个数就够了啊,八个数就够了,那我怎么样?那我光标是不是再回过头来啊?回答像之前一样,两两一比对,两两一比对,然后最后拿出来一个值,那我们肉眼看一下哪个是最多的。
07:17
八那我下次再比对的时候,是不是我还能拽出来一个数啊,就相当于怎么样,现在把这个是CTRL加CCTRL加V再给它。拿回来一套,这套是哪个,哪个哪个是最大的,是不是这个。八最大的。那个框起来啊。那我得需要这样多少次才能确定什么确定,我这里面所有的数全部排完了。嗯。是不是你看有几个数据需要几次啊,是不是这里面是,呃,这是九八,然后七五。4321是不是这这样就排序完成了是不是,那我看一下这里面横向需要几是也是需要几次啊,是不是,原先是这个是九次,后面是八次,后面几次是不是,那我们这里面就知道应该用什么去操作,是不是应该双重循环呢?那外层每次执行一次之后能确定是不是一个最大数啊,内次两个两个比对情况下是不是怎么的,就是它的内内部比较过程啊,这样情况下就是我们还和之前说的一样,外层控制行内行内层控制列,那我们这里面先写完代码,然后再给大家去演示一下这个东西啊,你可以怎么,你可以拿个Excel这里面再继续演示一下吧,因为这个东西很难懂啊,拿Excel工作表给大家看一下。
08:30
好,那这里面先先假如先写上一些数据啊,放大一点啊。怎么放大呀。这这样吧。啊,是不是这样可以放大了吧,能看清了吧?啊这里面改为自己的02:18。然后这里面写数字啊,写写这个实际内的数啊,比如说这个是四,然后是三,然后是512。九。七六。
09:00
啊对行行行,然后七这边有七了吧,好这样的一个数字是不是我们写完了,写完之后我们给它这个居中对齐一下,然后给它放大一下,怎么放大不了呢。好,16号字放大完之后,那我们这里面是不是怎么着俩俩一比对吧?它俩一比对之后,那是不是需要交换位置啊,大的需要怎么往后跑吧?嗯,需要往后跑的情况下,这里面是几啊?是三这是几啊四然后用四和谁比和这个五比吧,呃,四和五比情况下,这里面需要换位置吗?不需要,然后五跟一比需要换位置吗?需要,那这里面是一,这是五,五跟二比需要换位置吗?二这是几啊?是五,五跟九比换位置吗?不换了,然后这是九,是不是九跟八比换为什么换?这是九,这是什么呀?这是八。然后这是九跟六比换位,什么九六,然后是什么是九跟七换,为什么换七,这是九第一次执行,我看执行几次是不是,这是一次,两次,三次。四色五色。
10:01
然后是六次七次。八次是不是啊,就可以怎么的,就可以确定一个数了吧,哪个数字是有用的,是九用的吧,那下载执行的情况下,同样又指针又回不是这个下边回到这了,三个四比需要换一纸吧。不需要,这是三,这是几啊,是四,四跟一比换位置吗?换这是几啊?这是一,这是。四四跟二比换位置吗?换这是四,这是二,四跟五比换位置吗?不换这是几啊?是五,然后五跟八比换位置吗?不换,那这是五,这是几啊?这是八,八跟六比换位置吗?六这是八,六跟八跟七比呢,换位置,这应该是七,这是。八那八是不是确定我们有效的数数据了吧,啊那你看如果这样再再往下继续的情况下,是不是相当于我们那个之前那乘法乘法表决一样,只是怎么只是倒着给它输出来了吧?嗯,这是这样情况啊,倒着输出来,那只是到最后的时候我再确定,比如说俩数确定完之后,那剩一个数的时候,我还需要确定吗?因为一个数的时候,它本身就是怎么就是和自己比没有意义了吧,这是我们这个执行过程啊,把这个这俩希望大家能看懂啊,把这个截图给大家弄一下。
11:15
是十几啊16吧。18。48吗?好弄一下。诶,不是不要黄抗加Z是。16。然后去截图。这不就写完了吗?继继续写啊,你明白啥意思就得了吧,你还让我继续给往下给你写啊,下次比的时候谁三跟一笔换位置,然后是三跟二笔换位置,然后四跟三比不换位,然后四跟五笔不用换这位置,然后四跟六,那好像没啥事了,是不是,咱这数写的是不是有问题啊,就是写的太简单了吧,是不是,嗯,那我粘贴到什么,粘贴到咱们这个里面来啊。哎,好这个好,这个这个东西好这能粘贴过来,那好,那我们通过程序来给大家去演示一下这个过程啊,首先定义一个数组。
12:03
Int类型的AR这个数组,然后元素为十个,能看一下是。随便说四第一个是几啊是。742有没有咱们腾讯QQ号啊,是不是,然后是。三然后是五,然后是八,然后是九,然后是六,然后是一。几个了,现在。不够,还没测完呢,还别呢,不要两教十,然后是。够了吧,够了吧,十个吗?十个吧,呃,十个数据,那十个数据已经有了,是从一到什么,一到这个十啊,不是从零到九啊,那那我们这里面去给他操作,操作情况下,我这里面外层需要循环几层,就像这样的情况,这是不是行啊,控制行一行,两行,三行,四行,四行到这儿是不是,然后是五行到这儿,然后六行到这儿是不是,七行到这儿,八行到这儿,然后是九行是不是就可以了,到这里来说就是这个数字还用换吗?不用换了吧,是不是外层是不是循环九行啊,那我这里面十个元素要循环九行的情况下,应该怎么操作啊。
13:13
减一是不是?那应该怎么的啊?Int类型的这个length等于size of,呃,AR再除以一个。Size of a0啊,再减一就是什么?就是这个。我们这个外层循环是不是那内层循环呢?看一下那第一次需要循环几次,这俩一比对这是一次,这俩一比对这是两次,这是三次,四次,五次,六次,七次,八次,因为这里面还有这个十,就应该是怎么九次吧,是不是那之前那原因是怎么应该是这个是。外层循环嘛,这是内层循环是不是,那我们这里面需要写循环了,不循环int。I等于零,从零开始,因为数组下标是不是I小于。
14:01
Lengths是不是就循环九次嘛,是不是I做一个加压操作,这是外层循环在前内循环for循环,然后诶。负循环,Int j等于零。那阶小于什么,阶小于什么?这个里面我们看一下每次循环这里面是不是这个内层循环都在逐渐减少啊,减少了跟谁有关呢?是不是我取出来这个是外层循环直行次数有关的,那这里面什么应该是这个是lengths,再减去这个I是不是有关,是不是因为每次会越来越少,然后是什么是这个接要怎么样加加是不是比对,是比对哪两个数呢?我们这里面看一下。比对是不是比对什么比对接里面这个数据吧,是不是它和它相邻,这个是J和J加一,那我们这里面写的情况下,应该怎么写,是AR这个接和谁比较呢?和它这个后面这个比较,不是是不是AR。加一进行比较,谁大怎么的,谁往后去,谁小怎么谁往前来是不是,那怎么判断谁大谁小呢?是不是加上条件判断,If条件判断。
15:04
这样情况是谁大谁小啊?我这样判断后,后面的如果换位置情况,是不是大的数就变前面了,所以说我把这个改一下改成谁啊,如果前面这个大就前后交换完位置,是不是把大数都怎么都往后挪啊,挪回去啊好,那看一下这里面我我挪的时候是哪两数挪,它的相邻数挪,那这里面是不是也应该引入一个什么,引入一个第三个变量去接入这个值啊啊好,那引入过第三方变量去接入这个值,PMP等于谁啊,等于这个是AR。接,然后是AR。J等于ARJ加一就是它和相邻这个值吧,是不是啊,然后是A。J加一等于A等于,这个是tmp是不是这临时变量,临时变量存储就是呃是AR接的这个值是不是,那这样情况下我们这个什么啊,这个就写完了,写完情况下看一下执行过程啊,那先打印一下给大家看一下。
16:01
我把这个打印给复制一下。这里面是第几个是零七。主要是。开始执行。我们执行是第八个,不是第七个,只是我现在选择是第七个,但是因为主函数在哪,主函数在这吧,它执行这个过程行。这么神奇啊。内容呢?哪写错了吧,我看一下哪写错了啊。找一下这代码有问题啊,我们看一下全屏看一下。嫩减一我看一下啊,这里没有问题啊,咱们写有问题啊。是12345。六七八九十十个,再减去一个是九个。这里面是,呃。应该是零到九吧,应该是。
17:02
小于等于啊,这应该是小于等于吧,这块呢,我看一下。这是小于等于吧。就小鱼我看一下,先先执行一下,这里面这个出现点问题,我看一下开始执行一下。我看一下这个里面对不对啊。1234567小时应该没问题吧,就是还是还是什么,还是我们这这块这个这块出现问题吧,就是刚才说的是几次,说的是九次吧,是不是,那我们刚才这个弄的,呃,不是弄的时候应该是弄几次了就是。外,呃,不是不是,应该是外层应该是。我查一下啊,是是咱们再查一下是几次是呃,一次两次。三呃,不是,是因为这里面少个数啊,我还得加数吧,是不是这里面少数啊,再加个零啊,那比如说这样情况下就应该是怎么办呢?就应该是。第一层弄完之后就应该是怎么就应该是这个是零,这应该是九,这第一,这是第一次啊,然后是,呃,第一次是几个数,是十个数,第二次九个数,十九八七六五四三二一是14吧啊,咱们这里面是弄错了吧,那能九次了吧,这应该是从零到几啊,到九是不是加起来14啊,所以这里面应该写什么小于等于吧?嗯,小于等于这块出现问题啊,然后这个里面就没有问题啊,里面还是跟之前那个次数是一样的啊,我们再看一下调试开始执行。
18:24
打印的结果是一二三四五六七八九十是没有问题的,我们管这个叫什么叫什么排序叫冒泡排序。叫。冒。Po。排序这是个什么意思呢?为什么管它叫冒排序呢?这里面大家知呃知不知道一个物理线,就烧水的时候,烧水的时候怎么呢?就是这个水烧开之候会怎么样冒泡是不是,如果泡越大,它是不是它的浮力就越高啊,它在最它就可能怎么的浮在最上面是不是,那这里面就是相同的原理是怎么的数就怎么两一比对,或者是几极一比对,就是他们可能同时一比对,每次就是在同一水面上一比对起吧,是不是有一个炮最大的它下次的,它下次上升的速度是不是就比其他的要快了,就这样情况,就是这个冒排序,这里面我们这个排序方式是现在是怎么,现在是从小到大了啊从小。
19:18
到。大,那从大到小只需要改成一步就行,改哪步啊,把这个改成什么,改成这个是。小于号就是怎么着,就是哪个大哪个放在前面是不是,那我们看一下现在结果你把这十怎么样往前挪一挪是不是。不用往前挪啊,也可以啊,调试开始执行。打印出来十九八七六三十一吧,是不是这样,就是这是排序之后的一个数据,是不是把十最后怎么的挪到最前面了吧,然后把这个什么一挪到这个最后面了吧,啊就是经过一系列的排序,这是一个双重循环,外存控制行,内存控制列是不是需要执行多少行,然后再执行多少列,这里面比对什么相邻的两个数用谁啊,用这个if做条件判断,然后这里面是什么三个。
20:02
三句三句代码,这个是做一个操作,什么是两个数据进行交换是。两个数据交换交换位置吧,这样说也可以,最后每次执行就是外层每次执行。有啊。外从。循环。每次。执行一次啊,就每次执行,每次就是执行一次意思吧,每次执行都能确定什么呀,都能确定一个最大值。那内层循环循环一次呢?能比对两个相邻的哪个是最大的,是不是这样这样的结论呢,是不是,那把这写上是。内存。循环。
21:02
循环,每次执行能确定。两个。数值。中。的最大值,因为它俩比较是比较这俩了,是不是,那经过这样一轮比较之后,那我们就怎么呢,就能确定这个所有的数据,它们的排列顺序啊,那这里面从小到大,这里面是什么大于号从二小是什么小于号是不是,但你要注意一下它俩的位置啊,到底哪个在前,哪个在后,那这是我们讲的这个冒排序,那我们再看一下这个图里面这个执行过程,先先是无序的数,外层循环执行一次的时候能怎么的,能那个确认一个最大数是不是,内层执行情况应该是怎么是这样是内层执行吧,是不是外层控制行,内层控制列是不是,这俩一比较能比较出什么一个数吧,外层循环能就是,呃,就是能去掉一列一不是一行的吧,那就这意思,我还是保存一下啊,给大家发过去看一下。
我来说两句