美文网首页程序员
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;        
    }
}

相关文章

  • 冒泡,选择,插入排序以及二分查找

    冒泡排序 选择排序 优化选择排序 插入排序 排序案例 二分法查找 二分法查找的前提是数组必须是有序的; 二分查找案...

  • 二分法查找

    二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法...

  • 【算法】二分查找,冒泡排序

    目录二分法查找需求...在有序数组中插入新成员后,仍然是一个有序的数组冒泡排序url编码 二分法查找 https:...

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

    什么是数组? 为什么要用数组? 数组如何定义 数组遍历 for循环遍历 增强for循环 数组的默认值 数组的特点 ...

  • 算法和排序

    1、线性查找 2、二分法查找 3、冒泡排序

  • PHP的常用算法

    1、冒泡排序 2、快速排序 3、二分查找 假设数组是升序排列。

  • 常见排序算法

    目录 1. 二分查找法2. 冒泡排序3. 快速排序4. 插入排序5. 鸡尾酒排序6. 选择排序 二分查找法 适用范...

  • 一维数组

    一维数组通常用于数组的查找和排序 排序 1:倒序输出 2:升序or降序排列冒泡排序法 查找

  • 常见算法的 Python 实现

    二分法查找 非递归版本: 递归方法实现: 冒泡排序 选择排序

  • 排序算法

    冒泡排序 堆排序 插入排序 二分法查找插入排序 希尔排序 快速排序 归并排序

网友评论

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

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