数组

数组

是一种用于存储多个相同数据类型的存储模型

定义

静态初始化

int [] arr = {1,8,12,3,5,9};
int arr2 [] = {1,8,12,3,5,9};//创建一个长度为6的数组 内容为{}中的值

动态初始化

int [] arr = new int [10];//创建一个长度为10的数组 内容为默认值
使用
arr[0]=11;//给下标为0的元素 赋值11
int num = arr[1];//将下标为1元素的值 赋值给num

二位数组

定义
int [] [] arr = {{1,2,3},{1,5},{2,3,4,5}};// 创建一个二维数组 内容为{{}}指定
int [] [] arr = new int[3][4];//创建一个 二维数组 其中存放的数组长都为4 共3组
使用
arr[0][1]=11;//给下标为[0][1]的元素 赋值11 第0组中下标为1的元素赋值
int num = arr[2][1];//将下标为[2][1]元素的值 赋值给num

数组的遍历

//一维数组的遍历
int [] arr = new arr [10]; 
for (int i = 0;i<arr.length;i++){     
    System.out.println(arr[i]);
 }
//二维数组的遍历
int [] [] path = {
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16},
        };
for (int i = 0;i<path.length;i++){
       for (int j = 0; j < path[i].length; j++) {
            System.out.print(path[i][j]+ " ");
        }
        System.out.println();
}

数组的乱序

//一维数组      
Random rand = new Random();
        int temp=0;
        for (int i = 0;i<arr.length;i++){   
                int x = rand.nextInt(arr.length);//获得随机下标
                temp=path[i];
                path[i]=path[x];
                path[x]=temp;
            }
        }
//二维数组      
Random rand = new Random();
        int temp=0;
        for (int i = 0;i<path.length;i++){
            for (int j = 0; j < path[i].length; j++) {
                int x = rand.nextInt(path.length);//获得随机组号
                int y = rand.nextInt(path[x].length);//根据  <组号>  随机  <组中>    的下标 
                temp=path[i][j];
                path[i][j]=path[x][y];
                path[x][y]=temp;
            }
        }

冒泡排序

算法描述:两两比较 把这轮的最大值放到最后 经过多轮的比较 数组有序

普通冒泡
    public static void bubble11( int[] arr) {
        //最多比较length-1趟  最后1趟是有序的
        for (int i = 0; i < arr.length-1; i++) {//控制比较的轮数  
            //倒数第二个 和最后一元素比较 后 最后一个无需比较 
            for (int j = 0; j < arr.length-1; j++) {//控制每轮的比较 确保每次的最大值排到该轮的最后
                if (arr[j]> arr[j+1]){
                    arr[j]= arr[j+1]+ arr[j];
                    arr[j+1]= arr[j]- arr[j+1];
                    arr[j]= arr[j]- arr[j+1];
                }
            }
        }
    }
优化冒泡

1.改变数组有序后 轮数 不到最大值 继续比较的问题

2.改变 每次比较需要比较到 最后一个元素的问题

3.两边同时比较 减少 每趟 比较的次数 (end-begin)次

  public static void bubble3(int[] arr)    {
        int left;
        int right;
        int leftpos=0;//下一次开始的位置
        int rightpos=arr.length-1;//下一次结束的位置
        for (int i = 0; i < arr.length-1; i++) {
            int count =0; //不执行 无效循环
            left=leftpos;
            right=rightpos;
            //往右挑最大 和 记录下一次结束的位置
            for (int j = left+1; j < right; j++) {
                if (arr[j]>arr[j+1]){
                    arr[j]= arr[j+1]+ arr[j];
                    arr[j+1]= arr[j]- arr[j+1];
                    arr[j]= arr[j]- arr[j+1];
                    count++;
                    rightpos=j;
                }
            }
            //往左挑最小 和 记录下一次开始的位置
            for (int j = right; j >left; j--) {
                if (arr[j]< arr[j-1]){
                    arr[j]= arr[j-1]+ arr[j];
                    arr[j-1]= arr[j]- arr[j-1];
                    arr[j]= arr[j]- arr[j-1];
                    count++;
                    leftpos=j;
                }
            }
            //不执行 无效循环
            if (count==0){
               return;
            }
        }

选择排序

算法描述:每轮取得最小值 放到已排好序的数组后面 经过多轮的挑选 数组有序

    public static void select (int arr[]){
        for (int i = 0; i < arr.length-1; i++) {//控制第几轮比较 
            int min=arr[i];
            ///minIndex 必须=i  =0时 当该轮第一个值是 最小值时出错 for if 没有进去 修改minIndex值
            int minIndex=i;
            //获得本次的最小值的索引
            for (int j = i+1; j < arr.length; j++) {
                if (min>arr[j]){
                  minIndex =j;
                }
            }
            //该轮的 第一个数 和 该轮中的 最小值 交换
           	min=arr[minIndex];
            arr[minIndex]=arr[i];
            arr[i]=min;
            //第一轮比较后第一个数据有序
        }
    }

二分法遍历数组

要求遍历的数组必须升序

算法描述: 判断一个数是否存在 通过不断缩小(二分)比较的下标范围 来<快速>确定该数是否存在

    public boolean  isExsit (int[] arrSortUP,int serchNum){
        boolean flag = false;
        int left =0;
        int right = arrSortUP.length;
        //通过不断改变 左右下标的值 来缩小值所在的范围 最差 直到 left=right 确定值所在
        while(left<=right){
            int mid = (left+right)/2;
            if (arrSortUP[mid]==serchNum){
                return flag=true;
            }
            if (arrSortUP[mid]<serchNum){
                left=mid+1;
            }
            if (arrSortUP[mid]>serchNum){
                right=mid-1;
            }
        }
        return flag;
    }
posted @ 2022-05-26 22:50  ACMAN-Mr.Lee  阅读(19)  评论(0编辑  收藏  举报