冒泡排序算法及优化

 No.1

//	正常的两两交换实现
	private static void sort1(int[] a) {
		// TODO Auto-generated method stub
		int time = 0;
		int temp = 0;
		for (int i = 0; i < a.length-1; i++) {
			for (int j = 0; j < a.length-1; j++) {
				if(a[j]>a[j+1]) {
					temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
				}
				time++;
			}
		}
		System.out.println("跑了:"+time+"次");
		System.out.println(Arrays.toString(a));
	}

No.2

//	当数组后面的排好过后就不在运行实现
	private static void sort2(int[] a) {
		// TODO Auto-generated method stub
		//次数变量
		int time = 0;
		//中间变量
		int temp = 0;
		//控制变量---boolean	flag	当数组顺序在已经排好的情况下,后面的次数不在执行
		for (int i = 0; i < a.length-1; i++) {
			//控制变量---boolean	flag	当数组顺序在已经排好的情况下,后面的次数不在执行
			boolean flag = true;
			for (int j = 0; j < a.length-i-1; j++) {
				//如果相邻两数,左大于右,则互换位置
				if(a[j]>a[j+1]) {
					temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
					//有位置交换,设控制变量为false
					flag = false;
				}
				time++;
			}
			//判定当数组顺序在已经排好的情况下,后面的次数不在执行,跳出外循环
			if(flag) {
				break;
			}
		}
		System.out.println("跑了:"+time+"次");
		System.out.println(Arrays.toString(a));
	}

 No.3

	private static void sort3(int[] a) {
		// TODO Auto-generated method stub
		int temp = 0;
		//排序的起始和结束位置
		int end = a.length-1;
		int start = 0;
		//中间变量
		int k = 0;
		int p =0;
		//次数变量
		int time = 0;
		//外循环控制每次执行多少次
		for (int i = 0; i < a.length-1; i++) {
			//控制变量---boolean	flag	当数组顺序在已经排好的情况下,后面的次数不在执行
			boolean flag = true;
			//内循环1控制从左向右查找最大数字
			for (int j = start; j < end; j++) {
				//如果相邻两数,左大于右,则互换位置
				if(a[j]>a[j+1]) {
					temp = a[j];
					a[j] = a[j+1];
					a[j+1] = temp;
					//有位置交换,设控制变量为false
					flag = false;
					//获取最后判定的下标
					k=j;
				}
				//次数++
				time++;
			}
			//判定当数组顺序在已经排好的情况下,后面的次数不在执行,跳出外循环
			if(flag) {
				break;
			}
			//把获取的下标赋值给end变量
			end = k;
			//内循环2控制从右向左查找最小数字
			for (int j = end; j > start; j--) {
				//如果相邻两数,左小于右,则互换位置
				if(a[j]<a[j-1]) {
					temp = a[j];
					a[j] = a[j-1];
					a[j-1] = temp;
					//有位置交换,设控制变量为false
					flag = false;
					//获取最后判定的下标
					p=j;
				}
				time++;
			}
			//判定当数组顺序在已经排好的情况下,后面的次数不在执行,跳出外循环
			if(flag) {
				break;
			}
			//把获取的下标赋值给start变量
			start = p;
		}
		System.out.println(time);
		System.out.println(Arrays.toString(a));
	}

No.4

	private static void sort4(int[] arr) {
//		开始下标,结束下标
		int start = 0;
		int end = arr.length-1;
//		中间变量
		int temp = 0;
		int rap = 0;
//		次数
		int time = 0;
//		外循环控制次数
		for (int i = 0; i < arr.length-1; i++) {
//			内循环控制下标的每次判断
			for (int j = start; j < end; j++) {
//				实现满足条件就交换
				if (arr[j]>arr[j+1]) {
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
//					把末尾值给rap存上给开始
					rap = j;
				}
//				次数
				time++;
			}
//			开始下标给末尾
			end = start;
//			末尾给开始
			start = rap;
//			从后面往前面跑
			for (int j = start; j > end; j--) {
//				交换
				if (arr[j-1]>arr[j]) {
					temp = arr[j];
					arr[j] = arr[j-1];
					arr[j-1] = temp;
					rap = j;
				}
//				次数
				time++;
			}
//			开始给结尾,结尾给开始
			end = start;
			start = rap;
		}
		System.out.println(Arrays.toString(arr));
		System.out.println(time);
	}

这里详细介绍了怎么排序的,怎么实现的,如有不对请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值