程序逻辑与算法5_聂浩

聂浩 2021-09-30 17:02:23

9.30

工作内容

任务4.4.4 堆和栈

栈内存

栈内存存储的是局部变量。局部变量:类中方法内的变量(对应的,类中方法外的变量是全局变量)。

要定义局部变量,就得加载局部变量所在的方法。因此是方法先进入栈内存,再定义局部变量。

局部变量都有自己的作用域,一旦离开这个作用域,变量就会被释放(就行fori循环中的 i ,for循环结束后变量 i 就被释放了,再用变量 i 的时候会提示未定义。因此局部变量的生命周期都很短,因此栈内存的更新速度很快。

栈内存的结构是先进后出的,有点像子弹,最后压进去的子弹会被最先打出来。

堆内存

存储的是对象,凡是new的新对象建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的。

堆内存的结构是先进先出的,有点像排队检票,队伍前面的数据会被先处理。

 

任务4.4.8 折半查找

使用非递归方式对数组[8, 7, 12, 1, 5, 0, 6, 9, 2]执行折半查找

package com.xxm.task4;

/*
使用非递归方式对数组[8, 7, 12, 1, 5, 0, 6, 9, 2]执行折半查找
 */

import java.util.Scanner;
import java.util.Arrays;

public class Quest4_5_BinarySearch {
    public static void main(String[] args) {
        int[] arr = new int[]{8, 7, 12, 1, 5, 0, 6, 9, 2};
        Scanner sc = new Scanner(System.in);
        bubble(arr);
        System.out.println("排序后的数组为" + arr.toString());
        System.out.println("请输入你想查找的数:");
        int num = sc.nextInt();
        if (binarySearch(arr, num) >= 0) {
            System.out.println("您要找的数字是第" + (binarySearch(arr, num) + 1) + "个");
        } else {
            System.out.println("您要找的数字不在该数组中");
        }
    }

    /*
    1、对比mid与num,二分数组
    2、对比mid与num,二分数组。重复N次,设置计数器来记录分半后的数组长度len
            mid与num相等时,返回num的索引值。
            当len<=1时,对比mid与num,如果不等,返回一个负值,代表没找到。
     */
    public static int binarySearch(int[] arr, int num) {
        //定义初始最小、最大索引
        int low = 0;
        int high = arr.length - 1;
        //确保不会出现重复查找,越界
        while (low <= high) {
            //计算出中间索引值
            int mid = (low + high) / 2;
            if (num == arr[mid]) {
                return mid;
                //判断下限
            } else if (num < arr[mid]) {
                high = mid - 1;
                //判断上限
            } else {
                low = mid + 1;
            }
        }
        //若没有,则返回-1
        return -1;
    }

    /*
    二分搜索需要在有序数列中进行,因此用冒泡法将数列排序。
     */
    public static void bubble(int[] arr) {
        for (int i = arr.length; i > 0; i--) {
            for (int j = 0; j < i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = 0;
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }


}


这里需要注意的是,折半查找需要序列是有序的,因此先对数组进行了排序。 

学习内容

inputStream和bufferedReader

InputStream inputStream = System.in;
Reader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String name = bufferedReader.readLine(); //从键盘读取字符串
String sAge = bufferedReader.readLine(); //从键盘读取字符串
int nAge = Integer.parseInt(sAge); //将字符串转换为数字。

假期计划

今天除了上述内容,还在codegym里自己看了3-4课。

假期看看书,然后自己在codegym里也多学学,打下基础。

...全文
432 1 收藏 回复
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复

还没有回复,快来抢沙发~

相关推荐
发帖
长沙软件人才实训基地
创建于2021-09-15

38

社区成员

长沙软件人才实训基地致力于培养高素质软件技术人才! 全程职场化任务式训练,达到工程化、交付级标准。
帖子事件
创建了帖子
2021-09-30 17:02
社区公告

培养高素质软件技术人才!