[19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找
一、二维数组
多维数组可以看成以数组为元素的数组。可以有二维、三维、甚至更多维数组,但是实际开发中用的非常少。最多到二维数组(我们一般使用容器代替,二维数组用的都很少)。
【代码示例】
1 import java.util.*; 3 public class Test_0313_01 4 { 5 public static void main(String[] args) 6 { 7 //1、 Java中多维数组的声明和初始化应按从低维到高维的顺序进行 int a1[][]=new int[][4];//非法 8 //int a[][]=new int[2][3];//二维数组声明 2行(下标0-2) 3列(下标0-3) 9 int b[][]={ { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };// 二维数组的静态初始化 10 System.out.println(b[2][3]); 11 12 int a[][] = new int[3][]; //动态初始化 13 // a[0] = {1,2,5}; //错误,没有声明类型就初始化 14 a[0] = new int[] { 1, 2 }; 15 a[1] = new int[] { 2, 2 }; 16 a[2] = new int[] { 2, 2, 3, 4 }; 17 System.out.println(a[2][3]); 18 System.out.println(Arrays.toString(a[0])); 19 System.out.println(Arrays.toString(a[1])); 20 System.out.println(Arrays.toString(a[2]));
22 int c[][]=new int[][] {{2,3,5},{34,7},{4,5,6}}; 23 System.out.println(Arrays.toString(c[0]));//注意:ArrayIndexOutBoundsException 数组下标越界 24 System.out.println(c[1][1]);//c[1][1]代表先找第2行即{34,7},然后从中第2列即数字7。 25 26 } 27 }
【内存分析】
【示例】
1 import java.util.*; 2 3 public class Test_0313_02 4 { 5 public static void main(String[] args) 6 { 7 Object[] emp1={101,"小白",29,"讲师","2016.2.9"};//每一行可以使用一个一维数组存储: 8 Object[] emp2={102,"老李",39,"教授","2006.4.9"}; 9 Object[] emp3={103,"老王",35,"高工","2017.4.9"}; 10 11 Object table[][]=new Object[3][]; 12 table[0]=emp1; 13 table[1]=emp2; 14 table[2]=emp3; 15 16 for(Object[] temp:table){ 17 System.out.println(Arrays.toString(temp)); 18 } 23 24 } 25 }
二、冒泡排序
思想:算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。
【代码示例】
1 import java.util.*; 2 public class Test_0313_03 { 3 public static void main(String[] args) { 4 int a[]={3, 1, 6, 2, 9, 0, 7, 4, 5, 8}; 5 6 //外层核心,控制轮数。即当j=0时为第1轮会把最大的数9放在最后。当j=1为第2轮会把次大的数字8放在倒数第2位,依次类推 7 for(int j=0;j<a.length-1;j++ ){ 8 9 boolean flag=true;//此处是为了优化算法 10 11 //内层核心,可以实现的某轮最大的值移动到后面 12 for(int i=0;i<a.length-1-j;i++){// 1、注意是a.length-1=9(其中a.length=10),i可以实现从0变化到8 13 //2、-j是为了提升效率,j代表轮数,即后边的数字已经排序好了,不用在此遍历排序了,j越增大代表又排好一轮 14 if(a[i]>a[i+1]){//i在数组中的最大值为9,若上步是i<a.length(=10,即i可以取到9),则在此步中会异常,因为i+1可以=10,但数组中没有 15 int temp=a[i];//先把a[i]的值存起来 16 a[i]=a[i+1];//然后把a[i+1]的值覆盖a[i],此时a[i]的值已经发生变化 17 a[i+1]=temp;//把原来存在temp中的a[i]值给a[i+1],此时完成交换 18 19 flag=false;//即若发生过交换(即执行完上边3行,否则也不会到这里来),把flag置为false,若没有发生过交换,还是默认为true 20 //没发生过交换代表a[i]<a[i+1]符合要求 21 } 22 } 23 24 if(flag==true)//第6轮循环(即j=5)后,没有发生过交换即flag不可能为false,代表第5轮完成后已经排好序,否则肯定有交换 25 break;//从而可以直接结束全部循环,不会执行下边的代码。 26 System.out.println(Arrays.toString(a));//输出的最后一行为第5轮排好序的结果 27 28 29 } 30 } 31 }
三、二分查找
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)
比较,如果相等,则检索成功; 否则,若key小,则在数组前半部分中继续进行二分法检索;若key大,则在数组后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的
检索区间,如此进行下去,直到检索成功或检索失败。
【代码示例】
1 import java.util.*; 2 3 //二分查找 方法BinarySearch 4 5 public class Test_0313_04 { 6 7 public static int binarySearch(int arr[], int value){ 8 9 int low=0, high=arr.length-1;//low和high为数组的下标 10 11 while(low<=high){ 12 int mid=(low+high)/2; //mid是写在这里是动态变化的,写在外边mid是恒定的是不会返回-1的 13 if(value==arr[mid])//恰好为中间数 14 return mid; 15 if(value>arr[mid])//比中间数大 16 low=mid+1; 17 if(value<arr[mid])//比中间数小 18 high=mid-1; 19 } 20 21 return -1; 22 } 23 public static void main(String[] args) { 24 int a[]={2,5,1,4,6,7,12,8,3}; 25 26 System.out.println(Arrays.toString(a)); 27 28 Arrays.sort(a); 29 30 System.out.println(Arrays.toString(a)); 31 32 System.out.println(binarySearch(a,5)); 33 34 System.out.println(binarySearch(a,17)); 35 36 } 37 38 39 }