1、二維數組java
多維數組能夠當作以數組爲元素的數組。能夠有二維、三維、甚至更多維數組,可是實際開發中用的很是少。最多到二維數組(咱們通常使用容器代替,二維數組用的都不多)。算法
【代碼示例】數組
1 import java.util.*; 3 public class Test_0313_01 4 { 5 public static void main(String[] args) 6 { 7 //一、 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 }
【內存分析】優化
【示例】spa
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 }
2、冒泡排序3d
思想:算法重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來,這樣越大的元素會經由交換慢慢「浮」到數列的頂端。code
【代碼示例】blog
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++){// 一、注意是a.length-1=9(其中a.length=10),i能夠實現從0變化到8 13 //二、-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 }
3、二分查找排序
二分法檢索(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 }