详解-java冒泡排序

冒泡排序

原理分析

​ 对于刚接触java的初学者来说,冒泡排序是不得不说的一个内容,只要掌握了冒泡排序的思想,那么这一块的内容就很容易理解到位,下面将针对冒泡排序进行详细的讲解,如有问题,还请指出.

​ 首先,何为冒泡排序,在我的理解里,冒泡排序可以狭义地理解为将一个无序的数组中,最大的数一个个排到数组右侧,直到整个数组按从小到大依次排好(那到底需要多少次才能排好呢?这与参与排序的数字个数有关,后面进行讲解).

给定一个无序数组:

在这里插入图片描述

​ 在冒泡排序中,我们首先比较前两个数的大小,然后将大的数放在较小数的右侧,如图将B与C列的数比较,然后将较大的数放在C列,再将C列的数与D列比较,将较大的数放在D列,这样循环下去,直到H列,这便称为第一次排序,结果如下:

在这里插入图片描述

​ 我们可以发现,第一次排序后,最右侧的数字为50,即最大数.这是巧合吗?其实不然,我们思考一下,当我们进行第一次排序时,总是将两个数中的最大数放在右侧,那么比较到最后一个数时,放在右侧的数自然一定是比前面所有数都大(第一次排序就好比让最大的数从数组中浮现出来,冒泡的说法可能就是这样来的).

下面运用同样的方法进行第二次排序:

在这里插入图片描述

​ 我们可以发现,在第二次排序时,我们再比较F和G列的数字大小后,就可以不需要在去比较G和H列了(因为H列数字比前面的都要大),因此在本次排序中,我们实际只比较了5次大小.并且,我们还可以看到,此时G列的数字40也一定比前面的数字大,原理同第一次排序一样.

第三次排序:

在这里插入图片描述

​ 我们可以发现,这个数组在第三次排序后,已经成为了有序数组,但是,这不能说明我们针对7个数字的排序只需要3次就能完成,因为这组数据可能比较特殊,我们从第三次排序的结果可以看到,第三次排序只能保证F列的30这个数字比前面的都大,不能保证30前面的数字已经有序排列(因为我们每次排序只是将最大的数依次放在了右侧而已,并不能保证该数前面的数的大小关系),因此需要继续排序,直到C列的数比前面的数大为止.

第四次排序:

在这里插入图片描述

第五次排序:

在这里插入图片描述

第六次排序:

在这里插入图片描述

​ 第六次排序后,可以看到,C列的数字一定比前面的数字大,而C列前面只有1个数字,因此,整个数组成为从小到大的有序数组,冒泡排序完成.

几个关键点

通过以上对含7个元素的数组进行冒泡排序分析,我们可以发现几个有意思的地方:

  1. 含有7个元素的数组最多通过6次排序便可以完成冒泡排序,这不是巧合,每次排序我们都将最大的数放在右侧,7个数我们只需要找到6个相对的最大的数便可完成排序.

  2. 在第一次排序里,我们需要进行6次比较才能将最大数提出来,而在第二次排序时,由于最大数已经提出来,因此我们只需要5次比较,就可以将第二个最大数提出来,按照这个理论,到第6次排序,我们只需要比较1次就可以将第六个最大数提出来.

    在这里插入图片描述

    总结一下(针对一个含有n个元素的数组进行冒泡):
    1. 含有n个元素的数组,至多进行(n-1)次排序便可以完成冒泡排序.
    2. 针对每次排序:第(n-1)次,即最后1次排序,只需要比较1次便可完成本次排序

代码:

class MaoP{
	public static void main(String[] args){
		//定义1个数组
		int[] arr = {15,25,10,30,40,20,50};
		//调用方法
		mao(arr);
	}
	//定义1个方法,冒泡排序
	static void mao(int[] arr1){
		//外部循环冒泡次数
		for (int a = 0 ;a < arr1.length - 1 ;a++ ){
			//内部循环每次冒泡的操作次数
			for (int b = 0;b < arr1.length - 1 -a ;b++ ){
				//交换相邻位置的元素,小的排在前面
				if (arr1[b] > arr1[b+1]){
					int temp = arr1[b];
					arr1[b] = arr1[b+1];
					arr1[b+1] = temp;
				}
			}
		}
		//调用数组打印方法
		String str = java.util.Arrays.toString(arr1);
		System.out.println(str);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值