【算法入门】之冒泡排序

思路:

一个数组排length-1轮,6个元素的数组就排5轮,每轮再比较length-i次,i为轮数

每轮都能找到一个最大值放在最后,这个最大值后面就不用比较了,所以排一轮少一次,直到所有最大值排完

所以用两轮for循环,第一for控制轮数,第二for控制两两比较次数,两两比较,大的就交换位置

package bubble.array;
/**冒泡排序*/
import java.util.Arrays;
import java.util.Random;

public class BubbleSort {
	public static void main(String[] args) {
		int[] a=new int[10];
		for(int i=0;i<a.length;i++) {
			a[i]=new Random().nextInt(100);//随机生成[0,100)以内的数
		}
		System.out.print(Arrays.toString(a));
	//生成数组
		System.out.print(a.length);
	for(int i=1;i<=a.length-1;i++) {//控制外层轮数,共length-1轮
		for(int j=0;j<a.length-i;j++) {//内层数字交换,共length-i(i代表轮数。!!!注意此处 不能写a.length不然会超过边界产生a【10】
			if(a[j]>a[j+1]) {
				int t = a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	System.out.print(Arrays.toString(a));
}
}

有可能出现提前排完的情况。添加一个flag完善一下代码

package bubble.array;
/**冒泡排序*/
import java.util.Arrays;
import java.util.Random;

public class BubbleSort {
	public static void main(String[] args) {
		int[] a=new int[10];
		for(int i=0;i<a.length;i++) {
			a[i]=new Random().nextInt(100);//随机生成[0,100)以内的数
		}
		System.out.print(Arrays.toString(a));
	//生成数组
		System.out.print(a.length);
	for(int i=1;i<=a.length-1;i++) {//控制外层轮数,共length-1轮
		boolean flag=false;     //加一个flag完善方法,可能第2或第3轮就正好排完了,就跳出循环
		for(int j=0;j<a.length-i;j++) {//内层数字交换,共length-i(i代表轮数。!!!注意此处 不能写a.length不然会超过边界产生a【10】
			if(a[j]>a[j+1]) {
				int t = a[j];
				a[j]=a[j+1];
				a[j+1]=t;
				flag=true;    //有次if操作代表此时还是乱序,否则排好了
			}
		}
		if (flag==false) {//如果是false说明上面已经没有再进行排序了,说明排好了
			break;
		}
	}
	System.out.print(Arrays.toString(a));
}
}

来吧代码写的更优雅点,放到函数里

package bubble.array;
/**冒泡排序*/
import java.util.Arrays;
import java.util.Random;

public class BubbleSort {
	public static void main(String[] args) {
		
		int[] a=method1();//生成数组
		System.out.println(Arrays.toString(a));
	
		int[] bubbleA=method2(a);   //排序函数
		System.out.print(Arrays.toString(bubbleA));
}
	public static int[] method1() {
		int[] a=new int[10];
		for(int i=0;i<a.length;i++) {
			a[i]=new Random().nextInt(100);//随机生成[0,100)以内的数
		}
		return a;
	}
	public static int[] method2(int[] a) {
		for(int i=1;i<=a.length-1;i++) {//控制外层轮数,共length-1轮
			boolean flag=false;     //加一个flag完善方法,可能第2或第3轮就正好排完了,就跳出循环
			for(int j=0;j<a.length-i;j++) {//内层数字交换,共length-i(i代表轮数。!!!注意此处 不能写a.length不然会超过边界产生a【10】
				if(a[j]>a[j+1]) {
					int t = a[j];
					a[j]=a[j+1];
					a[j+1]=t;
					flag=true;    //有次if操作代表此时还是乱序,否则排好了
				}
			}
			if (flag==false) {//如果是false说明上面已经没有再进行排序了,说明排好了
				break;
			}
		}
		return a;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值