冒泡排序


前言

学习Java已经快两个月了,一开始说的是学Java需要的逻辑能力不强,这话没毛病,说的是不强,没说不要,今天我们就简绍下我们即将遇到的需要一点逻辑能力的简单算法,也是面试最爱问的Java基础算法之一——冒泡排序

一、冒泡排序概念

冒泡排序是一种对数组中数据元素排序的方法。每一次对数组的遍历都是将较大数交换到后面,重复这个过程,每次遍历都会将最大值换到最后一位,每次遍历后,该数组的规模都会减少一个。

二、原理分析

比如需要比较的int类型数组是{1,8,6,5,2}
第一趟,一共有有5个数据

比较谁大是否交换位置目前数组
1和8比8大{1,8,6,5,2}
8和6比8大{1,6,8,5,2}
8和5比8大{1,6,5,8,2}
8和2比8大{1,6,5,2,8}

5个数据第一趟比了4次

第二趟

比较谁大是否交换位置目前数组
1和6比6大{1,6,5,2,8}
6和5比6大{1,5,6,2,8}
6和2比6大{1,5,2,6,8}

比了3次

第三趟

比较谁大是否交换位置目前数组
1和5比5大{1,5,2,6,8}
5和2比5大{1,2,5,6,8}

比了2次

第四趟

比较谁大是否交换位置目前数组
1和2比2大{1,2,5,6,8}

比了一次

小结

1、如上面的需要排序的数组元素数据有5个,比了4趟,从这个规律我们可以得出一个需要排序的有序集合(数组、列表等)有n元素则需要比较n-1
2、从上面的每一趟比较的次数中,我们可以找到这么一个规律,数组中的个数 = 第几趟+在该趟中比较的次数,如果是需要排序的有序集合(数组、列表等)有n元素那么比如第一趟就可以写成n = 1+n-1,最后一趟(n-1趟)就可以写成n = n-1 +1。
3、每一次比较都会比出一个最大值放在后面
4、每回比较都是两个数据在比较,视比较结果交换位置

三、代码实现

1.排序方式小------->大

代码如下(示例):

public class Test01 {

	public static void main(String[] args) {
		int[] array = {1,8,6,5,2};// 创建一个int类型的数组
		bubbling(array);// 调用bubbling()方法(由于是在一个类里面调用,所以不用   类名.方法名 )
	}
	public static void bubbling(int[] array) {
		int temp = 0; // 建立临时变量,为后续两个元素之间的交换做准备
		for(int i = 0;i<array.length-1;i++) { // 根据元素的个数设定循环的趟数
			for(int j = 0;j<array.length-i-1;j++) { //根据原理设定每趟需要比较的次数
				if(array[j]>array[j+1]) { // 根据比较大小判断是否需要交换
					temp = array[j];
					array[j] = array[j+1];// 开始交换
					array[j+1] = temp;	
				}
			}
		}
		for(int i:array) { // 利用加强遍历输出排好序的数组
			System.out.print(i+" ");
		}
	}
}

代码如下(输出):

1 2 5 6 8 

2.排序方式大------->小

public class Test01 {

	public static void main(String[] args) {
		int[] array = {1,8,6,5,2};// 创建一个int类型的数组
		bubbling(array);// 调用bubbling()方法(由于是在一个类里面调用,所以不用   类名.方法名 )
	}
	public static void bubbling(int[] array) {
		int temp = 0; // 建立临时变量,为后续两个元素之间的交换做准备
		for(int i = 0;i<array.length-1;i++) { // 根据元素的个数设定循环的趟数
			for(int j = 0;j<array.length-i-1;j++) { //根据原理设定每趟需要比较的次数
				if(array[j]<array[j+1]) { // 根据比较大小判断是否需要交换
					temp = array[j];
					array[j] = array[j+1];// 开始交换
					array[j+1] = temp;	
				}
			}
		}
		for(int i:array) { // 利用加强遍历输出排好序的数组
			System.out.print(i+" ");
		}
	}
}

代码如下(输出):

8 6 5 2 1 

总结

其实这个大到小还是小到大排序其他都是一样的,只是判断条件哪里if(array[j]<array[j+1])大于,小与符号的改变。

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值