JAVA-初步认识-第五章-数组-常见操作-冒泡排序
一. 冒泡排序
这里介绍了另一种排序的方法,冒泡排序法。选择排序法比较接近人们正常的思维,一个数据和剩下的所有数据比较。
冒泡排序法是临近的数据间进行比较,大的数据就调到右侧,角标1-2的数据对比,角标2-3的数据对比......
无论是选择排序还是冒泡排序都是求解最值。
冒泡排序法,是一轮一轮地进行左右两侧的数据进行对比。第一轮将所有数据中最大的数据移动到了最右侧,这种操作的核心在于:一直保证大的数据在右侧,那么经过不断地对调,最大的数据肯定在最后一位中。第一轮将最大的数据移动到了最右边,接下来相同的操作移动次大值到次右位.....
这样从左到右,得到的是从小到大的数据排列。也可以从右边开始,两两比较,大的值放左侧,一直往左边进行比较,从而保证最左侧为最大值,最终得到的从大到小的数据排列。
可以从左往右,也可以从右往左;从左往右可以得到从小到大的排序,也可以得到从大到小的排序,同样的从右往左也是这样。
如果抛开技术层面不谈的话,一定要保证最值要位于两两比较的前进方向的位置上。
这里依旧采用的是大圈套小圈,怎么分析。对于大圈套小圈不是很理解,我的理解是,这里是循环结构for嵌套语句,外循环控制进行几轮排序,内循环控制每轮进行几次对比。循环嵌套的核心在于:一个问题的解决需要好几步才能解决,每一步都要进行要几次相同的操作。如果将这些所有的操作全部拆分开,程序也是可以运行的,问题也会得到解决。但是出于提高程序的复用性,设计了循环了结构。同样的设计函数的目的也是为了提高程序的复用性。
为什么循环嵌套能够成立?(视频中称之为大圈套小圈)什么是循环,就是重复进行的操作。我们从内循环入手,有多次大小比较,对它们设计了循环结构即内循环(多次的相同操作,为了提高复用性,就设计循环结构)。外循环也是循环,相较于内循环,思想的维度更高一筹,外循环成立的原因在于:多次对比这样的情况出现了好几次,好几次又符合了循环结构。最终循环嵌套结构搭建了起来。
还有关于循环嵌套结构的语句需要注意:对于构建循环次数的表达式,如果是脱离实际例子的,那么控制循环次数的初始表达式之类的都可以任意写,比如说循环五次,for(int x=1000; x<1005;x++),这里想说的一点就是思想不能僵硬,要明白书写语句的本质是什么。
自己的初步分析:所有的操作都是建立在数组中数据的基础上的,无论是操作的次数还是操作的数据,这一点是要明确的。本题中,数据的个数是6个。先不管遍历时进行了什么操作,总共进行了5次遍历,分别是:0-5遍历,0-4遍历,0-3遍历,0-2遍历,0-1遍历。6个数,进行了5次遍历,定义一个变量来控制遍历的次数。每次遍历的内部,也进行了操作。比如说0-5遍历时,是0-1对比,1-2对比,2-3对比,3-4对比,4-5对比,总共进行了5次对比操作。第2次遍历,进行了4次对比;第3次遍历,进行了3次对比;也就是说每次遍历里面的对比次数也在变化,也需要定义一个变量来控制对比的次数,至于怎么对比,怎么操作先不管。→确定的数组,就决定了确定次数的遍历(这里说成遍历不太严谨,遍历的范围在减少),也会确定遍历里面对比的次数。这个有点反斜三角的意思,一个变量控制行数,一个变量控制列数,由于列数在变化,导致列变量的循环次数还要借助行变量来控制。
经过视频讲解后,也能写出源代码。感觉这是脱胎于for语句嵌套,形成反斜三角的题目。
还有一点,其实在控制循环次数时,初始化表达式写为0是没有问题的,但是由于在数组中元素的角标是从0开始标号的,
视频接着讲解了从右边往左边进行的冒泡排序法,我们自己也尝试一下,(本质上还是反斜三角的另一种写法)
视频的解法,虽然结果是正确的,但是做法仍旧是从角标0开始,将较大的值往右移动。我以为的从右侧开始冒泡,是将较小的值往左移,毕竟从右边开始移动。视频中将x和y同时视为数组元素的角标。