美文网首页程序员
005-数组,冒泡排序,二分查找法

005-数组,冒泡排序,二分查找法

作者: Ktry | 来源:发表于2020-03-15 23:27 被阅读0次

    什么是数组?

    1、数组也是一种数据类型(应用数据类类型)
    2、数组是可以存放多个值
    

    为什么要用数组?

    当我们要存储相同类型的多个数据的时候,需要定义多个变量,这样在使用的不方便。因为数组是可以存储多个值,所以我们可以用数组来表示这个多个数据。
    

    数组如何定义

    基本数据类型定义
    数据类型 变量名 = 变量值;
    int a = 10;
    
    数组定义:
    数据类型 数组名;
    int[] arr;  或者   int arr[];
    
    数组的赋值
    静态初始化
    int[] arr = {10,15,12,7,20};
    或者int[] arr1 = new int[]{1,2,3,4,5};
    
    获取数组元素   数组[下标]     arr[0]
    
    动态初始化    长度必须要定义
    int[] arr = new int[长度];
    赋值   arr[0] = 1;
          arr[1] = 10;
          ......
    
    获取数组元素   数组[下标]     arr[0]
    

    数组遍历

    • for循环遍历
    //定义一个数组,输出数组中的每一个元素 
            String[] arr =  {"cxk","lsis","wangwu","jack","rose","赵四"};
    
             //int len = arr.length; //获取数组中的所有的元素------>遍历 
            for(int i =0 ; i < arr.length; i++) {
                // i 被当做是数组的下标
                System.out.println( arr[i] ); 
                }
            }
    
    • 增强for循环
        /*
             *  foreach循环
             * 
             *  语法:
             *                              (定义变量名)
             *   for(数组中的每一个元素的类型  遍历出来的每一个元素  :要遍历的数组){
             *   
             *   }
             */
    
    String[] arr = {"cxk","lsis","wangwu","jack","rose","赵四"};
            for(String  a    :  arr) {
                System.out.println(a);
            }
            // fore    快捷键  alt+/
            for (String a : arr) {
                System.out.println(a);
            }
    

    数组的默认值

    /**
     * 数组的默认值
          基本数据类型
    
     *    类型                    默认值
     *    int                     0
     *    byte                    0
     *    short                   0
     *    long                    0
     *    
     *    float                   0.0
     *    double                  0.0
     *    
     *    char                   \u0000   GBK   UTF-8    ASCII
     *    
     *    boolean                false
     *    
     *    
     *    引用数据类型
     *    String                null   所有的引用数据类型的默认值都是null
     *    
     *    null    和        ""
          null    指的是这个变量没有指向内存中的某一块空间
          ""      指向的是内存中为""的字符串      
     *    String s1 = null;
     *    String s2 = "";
     *    
     */
    

    数组的特点

    /**
    * 1、数组是定长的(数组一旦定义,长度不能改变)
    * 2、数组的长度用 数组名length获取
    * 3、数组的下标从0开始,到长度-1结束
    * 4、数组中的每一个元素的类型一致的 
    * 5、如果数组的下标超出范围,会报错(异常)   ArrayIndexOutOfBoundsException  数组下标越界异常
    */
    

    测试

    1、定义一个数组,  输入一个数字,  得到这个数字在数组中的下标 (用方法做)
    2、定义一个数字, 求最大值,最小值,平均值
    

    参考代码

    /**
     *    1、定义一个数组,  输入一个数字,  得到这个数字在数组中的下标 (用方法做) 
     *     思路:   遍历数组,然用输入的数字与数组的每一个元素进行比较,如果相等,直接返回当前元素的下标
     *
     */
    public class Test1 {
        public static void main(String[] args) {
            int[] arr = {10,29,18,7,65,11};
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入一个数字");
            int num = sc.nextInt();
            int index = method1(num,arr);
            System.out.println("您输入的数字在数组中的下标为"+index);
        }
        public static int method1(int num,int[] arr) {
            for (int i = 0; i < arr.length; i++) {
                if(num == arr[i]) {
                    return i;
                }
            }
            return -1;
        }
    }
    /**
     * 2、定义一个数组, 求最大值,最小值,平均值
     * 思路:假设第一个数为最大值。与数组中的每一个元素进行比较,元素比最大值大,就把当前这个值赋给最大值
     *
     */
    public class Test2 {
        public static void main(String[] args) {
            int[] arr = {12,45,87,24,68};
            //method(arr);
            int[] arr1 = method1(arr);
            System.out.println("数组的最大值为:"+arr1[0]);
            System.out.println("数组的最小值为:"+arr1[1]);
            System.out.println("数组的平均值为:"+arr1[2]);
        }
        //返回的是数组,将三个值放到数组中一起返回
        public static int[] method1(int[] arr) {
            int max = arr[0];
            int min = arr[0];
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                if(max < arr[i]) {
                    max = arr[i];
                }
                if(min > arr[i]) {
                    min = arr[i];
                }
                sum += arr[i];
            }
            //定义一个数组,将最大值,最小值,平均值,放到数组中。
            int[] arr1 = {max,min,sum/arr.length};
            return arr1;
        }
        //求出最大值,最小值,平均值并输出
        public static void method(int[] arr) {
            int max = arr[0];
            int min = arr[0];
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                if(arr[i] > max) {
                    max  = arr[i];
                }
                if(arr[i] < min) {
                    min = arr[i];
                }
                sum = sum + arr[i];
            }
            System.out.println("数组的最大值为:"+max);
            System.out.println("数组的最小值为:"+min);
            System.out.println("数组的平均值为:"+sum/arr.length);
        }
    }
    
    

    数组排序

    冒泡排序

    /**
         *   对数组进行升序排列
         * 
         * 
         * @param arr     要排序的数组
         * @return           排序之后的数组
         */
        public static int[] sort(int[] arr) {
            //  arr.length -1    比较轮数    i               外层 循环控制  比较轮数   
            for (int i = 0; i < arr.length -1; i++) {
                //arr.length -1    比如  5个数最多只能比较4次     每一轮比较的次数    j     内层 循环控制  比较次数   
                // 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;
                    }
                }
            }
            return arr;
        }
    
    
    • 优化
    public static int[] sort1(int[] arr) {
            int count = 0;
            for (int i = 0; i < arr.length -1; i++) {
                //定义一个信号量 1,2,3,4,5
                boolean flag = true;
                for(int j = 0 ; j < arr.length-1 -i; j++) {
                    if(arr[j] > arr[j+1]) {
                        flag = false;
                        int temp = arr[j];
                        arr[j] =arr[j+1];
                        arr[j+1] = temp;
                    }
                }
                count++;
                System.out.println("这个数组比较了"+count+"轮");
                //判断flag 
                if(flag == true) {
                    return arr;
                }
            }
            return arr;
        }
    
    
    • 选择排序
    public static int[] sort(int[] arr) {
            for (int i = 0; i < arr.length; i++) {
                //假设当前这个数为最小的数字  min是这个数的下标
                int min = i;
                for (int j = i+1; j < arr.length; j++) {
                    if(arr[min] > arr[j]) {
                        min = j;
                    }
                }
                //等比较结束   min所对应的值为最小值
                //arr[i]   arr[min]      min  ==  i 
                if(min != i) {
                    int temp = arr[i];
                    arr[i]  = arr[min];
                    arr[min] = temp;
                }
            }
            return arr;
    }
    
    

    二分查找法

    public class Demo8 {
        public static void main(String[] args) {
            //折半查找法前提:数组必须是有序的
            int[] arr = {12,56,78,92,106,207,300};
            int index = method(107, arr);
            System.out.println(index);
        }
        public static int method(int num , int[] arr) {
            int min = 0;
            int max = arr.length -1;
            while(min <= max) {
                int middle = (max+min)/2;
                if(num > arr[middle]) {
                    min = middle+1;
                }else if(num < arr[middle]) {
                    max = middle -1;
                }else {
                    return middle;
                }
            }
            return -1;        
        }
    }
    
    

    相关文章

      网友评论

        本文标题:005-数组,冒泡排序,二分查找法

        本文链接:https://www.haomeiwen.com/subject/xmiiehtx.html