数据结构与算法(java):冒泡排序

冒泡排序简单来说就是在一组数据中,从左到右,俩俩比较,然后把较大的数据往前推,一轮下来之后,最大的一个数据就被推到了最右边。

基本原理

每轮从第一个元素开始,相邻两元素之间比较大小,交换元素彼此的位置,直到最后一对相邻元素
总共进行n-1轮
每轮进行n-i-1次比较(这是从下标为0开始的,如果是从下标为1开始,则每轮进行n-i次比较)

有如下数组(int[] arr = new int[]{3,9,-1,1-,20)假设我们要实现数组从小到大排序,
排序过程如下
=

代码实现

1、不用i表示轮数

	
	int [] arr = new int[]{3,9,-1,10,20};
		//外循环控制轮数
        for(int i = 0; i<arr.length-1; i++){
        //内循环控制比较次数
            for(int j = 0; j<arr.length - i-1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

2、假设用i同时表示轮数


   int [] arr = new int[]{3,9,-1,10,20};
  		//外循环控制轮数
        for(int i = 1; i<arr.length; i++){
            //内循环控制比较次数
            for(int j = 0; j<arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
冒泡排序优化

因为排序过程中,个元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明列有序,因此可以在排序过程中设置一个标志位flag来判断元素是否进行过交换,从而减少不必要的比较。
具体实现如下:

	int temp = 0;
	boolean flag = false; //标记位,true表示交换过,false表示未交换过
	for(int i = 1; i<arr.length; i++){
		for(int j = 0; j<arr.length - i; j++) {
	        	if (arr[j] > arr[j + 1]) {
	                temp = arr[j];
	                arr[j] = arr[j + 1];
	                arr[j + 1] = temp;
	                flag = true;
				}
	    }
	    System.out.println("第" + (i + 1) + "趟排序后的数组");
	    System.out.println(Arrays.toString(arr));

		if(!flag){
			break;
		}else{
			flag = false;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值