数据结构之排序算法——冒泡排序(Java实现)

基本介绍
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) , 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果- -趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

图解:对数据进行从小到大进行排序 4 , 9 , -5, 7, -3
在这里插入图片描述
冒泡排序的的演变历程:
每一次的循环过程中不过只是循环的次数减少了,而且这个正好还就是每次减 1.这个时候就可以在外层抱一个for循环,而在里层for循环的判断条件减 1 即可。
在这里插入图片描述

具体实现代码如下:而冒泡排序是使用的俩个for循环,对应的时间复杂度就是一个平方阶,即 O(n ^ 2)

public class Bubbling {
	public static void main(String[] args) {
		int arr[] = { 4, 9, -5, 7, -3 };
		// 首先是把最大的数排在最后
		int index = 0;// 临时变量
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 如果前面的数比后面的大则交换
				if (arr[j] > arr[j + 1]) {
					index = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = index;
				}
			}
		}
		System.out.println("冒泡排序后的数组:" + Arrays.toString(arr));
	}
}

在上述代码实现的过程当中如果出现给出的数组本身就是一个有序的序列,而再对其进行循环排序,很显然就浪费了时间,就此可以对上述代码进行修改,加上一个flag变量用于判断这一次循环过程当中是否交换了数据。而每一次交换过数据之后将falg的值设为true,并且在第一层循环当中对flag的值进行判断。

		int arr[] = { 4, 9, -5, 7, -3 };
		// 首先是把最大的数排在最后
		int index = 0; // 临时变量
		boolean flag = false;  //表示是否进行过交换
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				// 如果前面的数比后面的大则交换
				if (arr[j] > arr[j + 1]) {
					flag = true;
					index = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = index;
				}
			}
			if (!flag) {
				// 表示没有交换过,在这个情况下是排序完成了的,跳出循环
				break;
			} else {
				flag = false;// 把falg置为false重新进行循环交换
			}
		}

将代码使用一个方法进行封装。在上述代码加上一个方法定义即可,在这个方法当中传递一个待排序数组即可。

public static void bubbling(int [] arr){
	。。。。。
} 

最后我们可以通过代码测试冒泡排序的性能:
先初始化一个80000容量的数组:并且对数组先进行赋值:

int[] arr1 = new int[80000];
	for (int i = 0; i < 80000; i++) {
		arr1[i] = (int) (Math.random() * 1000000); //生成一个[0,1000000) 的随机数
	}

导入时间类:获取时间

	Date a= new Date();
	SimpleDateFormat SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	String a1 = SimpleDateFormat.format(a);
	System.out.println("排序前:"+a1);
	
	bubbling(arr1);
		
	Date b= new Date();
	String b1 = SimpleDateFormat.format(b);
	System.out.println("排序后:"+b1);

可以看到运行的时间基本上是在15秒钟左右:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值