javaSE练习Day02 冒泡排序

本文详细解析了Java中的冒泡排序算法,包括其工作原理和优化技巧。通过示例代码展示了如何使用for和while循环进行排序,并探讨了两者的应用场景。同时,文章还介绍了如何利用标志变量控制循环的结束,以及如何通过嵌套循环实现更复杂的操作。
摘要由CSDN通过智能技术生成
//怎么理解for,while循环作用
//怎么使用嵌套循环

import java.util.Arrays;
import java.util.Random;

public class BubbleSort {
    public static void main(String[] args){
        //冒泡排序流程
        //第一次 从第1个数开始前一个数和后一个数逐个比较,将较大的数放在最后面,这样最大的数一定在最后面
        //第二次 按照第一次的来,这样不同点在于少比较了最后一个数,也就是新的待排数组长度少1.结果不仅最大的在后面,第二大的一定也在最后面,
        //...
        //第n次,按照第一次的来,少比较了n-1个数,新的待排数组长度少1,第n大的数在最后面。
        //...
        //直到内层循环不需要进行了,每次排成功一个位置,新的待排数组长度-1
        //所以外存循环就是控制内存循环需要执行几次,
        //内层循环用于将待排数组冒泡比较。

        int[] arr = new int[10];
        //for是计数型,比较方便,while可以将条件写为true。 for的;
        //这里最终次数用 count全局变量统计--
        int count = 0;

        //标志,开始是false
        boolean flag;
        byte b1 = 10;
        byte b2 = 20;
        System.out.printf("b1^b2=%d",b1^b2);
        // 1010^10100 = 11110 = 2+4+8+16 = 30;

        Random random = new Random();
//        for(var num : arr){
//            //只能查看,不能赋值
//            num = random.nextInt();
//        }
        for(int i= 0 ;i<arr.length ;i++){
            arr[i] = random.nextInt(100);
        }
        System.out.println("排序前"+ Arrays.toString(arr));
        while(true){
            flag = true;
            //内层应该用for,因为满足条件
            for(int j = 0;j<arr.length-1-count;j++){//这里需要-1(比较n-1次),最后的就不需要比较了。长度变了
                if(arr[j]<arr[j+1]){
                    //注意位运算,会自动类型转换,
                    flag = false;//不能确定一定是顺序的,反之,没有进入条件说明是有序的
                    int temp = arr[j]^arr[j+1];
                    arr[j] ^= temp;
                    arr[j+1] ^= temp;
                }
            }
            count++;
            //什么时候结束呢?  --虽然是死循环,但是可以通过break结束,且java允许死循环,提供服务的呗
            //因为我不确定执行多少次,但是可以通过flag标志知道啊
            if(flag){
                break;
            }
            //相当于条件是!flag的do while
        }
        System.out.println("排序后"+ Arrays.toString(arr));
        System.out.println("一共执行了"+count+"次");//最多是10次..最后一个数是最大的数。。这里是从后往前,一次只能移动一个单位
        //其实最后一次最内层循环一次都没有执行 。这就是说最多是10次,但是9次不影响结果
        //知道最多是length次


        //探究for:型循环
        //逻辑 ,探究外存循环最多次数.尽可能少
        //若数组长度是1,那么就不需要判断
        //若数组长度是2,需要1次就行
        //数组长度是3,需要2次,
        //...长度为n,就是n-1次
        for(int i = 0;i<arr.length-1;i++){
            for(int j= 0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){//注意这里下标
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println("排序后"+ Arrays.toString(arr));
        //这样就足够了

        //各有各的好处,虽然时间慢但是简单易操作,比价灵活
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漫漫程序鹿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值