小鑫的JAVA之路(7):简单算法之冒泡排序详解

讲完了数组跟循环结构后,我们来讲一个简单算法。

冒泡排序

在这里插入图片描述
这里有四个石子,我们要知道在鱼吐泡泡的时候,都是小泡泡到大泡泡,之所以叫冒泡排序就是这个原因。那么我们实现的原理是什么呢?首先我们比较第一个和第二个数的大小,如果第一个数大于第二个数那么两个数互换,如果第一个数小于第二个数,那么他们的位置不变。那么怎么将两个数互换呢?我们这里介绍一种中间值的互换方法。
代码如下:

int a = 10;
int b = 8;
int c = a ;
//中间值
a = b;
//把b的值赋给a
b = c ;
//把c的值赋给c

因为我们把a的值赋值给了c,所以c的值就等于a的值,所以把c的值赋给b就等同于把a 的值赋给了b。这就是中间值互换的方法。
我们讲完了交换值的方法,我们接着来讲冒泡排序的实现原理。如果第一个数大于第二个数,他们互换位置后,我们再来比较第二个数跟第三个数的大小,如果大则互换,接着比较第三个数和第四个数的大小,直到比较n,n-1的值,来找到最大值,将最大值排到最后面。接着我们来重头开始比较,原理同上。但是,注意,我们已经找到了最大值,所以我们没有必要继续比较倒数第二项与倒数第一项的大小。所以接下来我们来实现代码。
首先我们肯定是有两个循环的对吧。所以我们得使用双层嵌套循环,外层循环和内层循环分别控制什么呢?我们来分析一下。
比如我们有个五个数数组
{1,3,2,5,4}
外层第一次循环:
内层第一次循环:
1与3进行比较,不互换
内层第二次循环:
3与2比较,互换
内层第三次循环:
3与5比较,不互换
内层第四次循环:
5与4比较,互换
通过第一次外层循环我们成功的找到了最大的值是5,并且把它排到了数组的最后一位。
现在的数组变成了
{1,2,3,4,5}
看着是不是好像完成了我们的目标,但是这只是个巧合而已。所以,我们来看第二次循环。
外层第二次循环:
内层第一次循环:
1与2进行比较,不互换
内层第二次循环:
2与3比较,不互换
内层第三次循环:
3与4比较,不互换
因为我们已经找到了最大值,所以并不需要进行第四次内循环。
剩下的大家就自己画一下,思考一下。这里我就不再画了。因为我们有5个数,外层循环只需要进行4次,内层循环怎么控制呢?第一次4次,第二次3次,第三次2次。每次外层循环开始的时候,我们内层循环的初始值还是一开始的值,怎么设置条件控制语句呢?这里我们先实现代码然后再进行详细的讲解。
代码实现:

    public class Test02 {
	public static void main(String[] args) {
		int arr[]= {3,2,7,1,9,5,6,8,4};
		//定义一个数组
		for(int i = 0;i<arr.length-1;i++) {
		//外层循环次数
			for(int j =0;j<arr.length-i-1;j++) {
			//内层循环次数
				if(arr[j]>arr[j+1]) {
					int a = arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=a;
					//值的互换
				}
			}
		}
		for(int b:arr) {
		//加强for循环遍历数组
			System.out.println(b);
		}
	}
}

首先我们先定义了一个数组,因为我们前面找出了外层循环的次数,数组长度为5的时候他为4,所以我们可以得到,外层循环的次数就是数组的长度-1。内层循环的次数呢?我们来看i的值,第一次外层循环为0,第二次外层循环为1,第三次为2。以此类推,我们会发现当我们用数组长度 -1- i 刚好能得到我们内层循环进行的次数,所以我们内层循环的条件判断也由此得出。
最后我们遍历数组得到一个排好了序的数组,结果如下:
在这里插入图片描述
好了,以上就是冒泡排序的原理以及代码实现。接下来我们会讲到更多基本简单算法。

猜你喜欢

转载自blog.csdn.net/weixin_49209692/article/details/107892522