Java基础--循环进阶

1.二分法

  • 用于查找有序数组中是否存在某个数组元素,以及它的位置

  • 每次查找时,从范围中选取中间部位的数字进行比较,如果不相等,则按照比较结果缩小范围

  • //猜一猜目标数字是否在数组中,以及它在数组中的哪个位置
    int[] arr = {1, 3, 5, 6, 10, 77, 78, 90};
    Scanner input = new Scanner(System.in);
    System.out.print("请输入目标数字:");
    int num = input.nextInt();//目标数字
    //范围会随着循环不断变小
    int left = 0;//范围最左侧
    int right = arr.length - 1;//范围最右侧
    while(left <= right) {
        /*if (left > right){
            System.out.println("没有找到");
            break;
        }*/
        int middle = (left + right) / 2;//中间数字的下标
        //拿中间的数字和目标数字作比较
        if (arr[middle] == num) {
            System.out.println("找到了,这个数字是数组中的第" + (middle + 1) + "个");
            break;
        } else if (arr[middle] > num) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    if (left > right) {
        System.out.println("没找到");
    }

2.求三个班的平均分

  • //计算3个班的平均分
    Scanner scanner = new Scanner(System.in);
    int[] scores = new int[5];//一个班有5个人
    //外层循环代表班级,循环一次得到一个班级的平均分
    //内层循环代表分数,循环一次累加一个分数
    for (int j = 0; j < 3; j++) {
        int sum = 0;//班级总分
        System.out.println("---------开始统计第" + (j + 1) + "个班的成绩---------");
        for (int i = 0; i < scores.length; i++) {
            System.out.print("请输入第" + (i + 1) + "个人的成绩:");
            scores[i] = scanner.nextInt();
            sum = sum + scores[i];//累加求和
        }
        System.out.println("平均分为" +  (double)sum / scores.length);

3.在数组中插入元素

  • int [] nums = {1, 4, 6, 7};
    //向nums中插入一个数字
    //因为原数组没有空间插入新数字,所以复制一个长度+1的新数字
    int[] newNums = Arrays.copyOf(nums,5);
    System.out.println(Arrays.toString(newNums));//[1, 4, 6, 7, 0]
    //向数组中插入一个数字,要求插入后仍然是顺序排序
    //1.先找到要插入的位置
    Scanner input = new Scanner(System.in);
    System.out.println("请输入要插入的数字:");
    int num = input.nextInt();
    //遍历数组,将要插入的数字跟数组元素做比较
    /*int index = 0;//要插入的位置(记录下标)
    int i = 0;
    for (; i < newNums.length; i++) {
        //如果num小于某个数组元素,则说明找到了应当插入的位置,记录下来
        if (num <= newNums[i]) {
            index = i;
            break;//找到了就跳出循环
        }
    }
    if (i == newNums.length) {
        index = newNums.length - 1;
    }*/
    int index = -1;
    ​
    for (int i = 0; i < newNums.length; i++) {
        //如果num小于某个数组元素,则说明找到了应当插入的位置,记录下来
        if (num <= newNums[i]) {
            index = i;
            break;//找到了就跳出循环
        }
    }
    if (index == -1) {
        index = newNums.length - 1;
    }
    //从后往前依次给元素重新赋值,后一个元素的值等于前一个元素。
    //循环条件为i > index , 即只挪动插入位置之后的元素
    //2.将元素后移,腾出位置
    for (int i = newNums.length - 1; i > index ; i--) {
        newNums[i] = newNums[i - 1];
    }
    //3.将要插入的元素放入指定位置
    newNums[index] = num;
    System.out.println(Arrays.toString(newNums));

4.冒泡排序

  • 冒泡排序是相邻两个做比较,(顺序排序时)将较大的数字往后移,每轮循环都会使一个最大的数放在最后一位,然后剩下的数字再进行下一轮比较

  • N个数字来排序,两两相比小在前,外层循环N-1,内层循环N-1-i;

  • int [] arr = {5, 2, 1, 4, 3};
    //外层循环代表轮数,5个数字比较4轮,每轮(剩下的数字)都会有一个最大的放在最后一位
    for (int i = 0; i < arr.length - 1; i++) {
        //j可以写成<arr.length - 1, 但是实际上后面的比较是无用的,携程arr.lenth -1 -i 可以减少资源浪费
        //内层循环代表比较次数,每次都是相邻两个数字做比较
        //内层循环的次数 = 数组元素长度 - 1 - 轮数(轮数从0开始)
        for (int j = 0; j < arr.length - 1 - i; j++) {
            //如果不是小的在前,则交换两个元素的值,使其变为小的在前
            if (arr[j] > arr[j + 1]) {
                int temp;
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

  • 如果要逆序,只需要将if判断的条件改为<

5.选择排序

  • int [] arr = {5, 3, 2, 4, 1};
    //外层循环代表轮数,每一轮都会将(剩下的数中)最小值放在最前面
    for (int i = 0; i < arr.length - 1; i++) {
        //内层循环代表次数,每轮都是拿(剩下的数中)的第一个元素和其他元素作比较
        //第0轮,拿第0个元素和其他元素比较
        //第1轮,拿第1个元素和其他元素比较
        //第i轮,拿第i个元素和其他元素比较
        //第i轮比较时,第一个元素的下标为i,其他元素下标的范围为i + 1到length - 1
        for (int j = i + 1; j < arr.length; j++) {
            if(arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(arr));

    如果要逆序,只需要将if判断的条件改为<

6.Arrays.sort()

  • java为我们提供了数组排序的方法,是顺序排序

  • int [] arr = {1, 3, 5, 1, 2};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值