是一种用于存储多个相同数据类型的存储模型
静态初始化
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; }