1. 程式人生 > >【JAVA】基礎:陣列、二維陣列、排序

【JAVA】基礎:陣列、二維陣列、排序

陣列:

用於儲存大量同一型別的資料。
陣列的定義格式:
資料型別 陣列名[ ]=new 資料型別[陣列長度 ];
給值:
1.陣列名 [下標 ]=值; 如:陣列名[ 0]=10; 陣列名[ 1]=20;
2.資料型別 陣列名[ ]={值,值,值…};
陣列預設值是0
注意:
陣列下標是從0開始的,注意不要賦值或訪問越界。
比如:陣列的長度是2,就只能給下標0、1賦值。如果超出了就會報訪問越界錯誤。
在這裡插入圖片描述
在這裡插入圖片描述

二維陣列:

二維陣列就是一個行列結果。
一維陣列存放資料方式:{1,2,3,4,5…}
二維陣列存放資料方式:{{1,2},{3,4},{5,6}…}
定義二維陣列:
資料型別 陣列名[ ][ ]=new 資料型別[行數 ][列數 ];
給值:


陣列名[ 下標][下標 ]=值; 如:arr[ 0][0 ]=1;

 int arr[][] = new int[3][4];//3,4代表3行4列
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				arr[i][j] = i + j;
			}
		}

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 4; j++) {
				System.out.print(arr[i][j] + "\t");
			}
			System.out.println();
		}

執行結果:
在這裡插入圖片描述

排序:

1.氣泡排序

int arr[] = {11,3,30,42,35,6};
        //3 6 11 30 35 42
        /**
        3 11
        3 11 30
        3 11 30 42
        3 11 30 35 42
        3 11 30 35 6 【42】

    for(int j=0; j<6; j++) {
            for(int i=0 ;i<arr.length-1-j; i++) {  //i ==4
                if(arr[i] > arr[i+1]) {  //arr[5]
                    int temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }

2.選擇排序

 100,2,3,23,66,98,18,50
    默認了0 位置上的數最大  100    zuidaxiabiao = 0  zuidashu = 100
    0   和  1 位置上的數比較,發現0大, 不換
    0   和  2位置上的數比較, 發現 0大,不換
    。。。。。。
    0 和 7比較, 0比較大,0和7交換位置
    50 2 3 23 66 98 18 100
    選擇排序的精髓就是我們只換下標,不直接換實際的數,這樣可以減少更換的次數,從而提高效率
    public void xuanZhePaiXu() {
        /**
    {1,3,2,66,23,98,18,50}

    1 ,3,2,66,23,98,18,50
    100,2,3,23,66,98,18,50

    氣泡排序 -- 每一次都要進行交換,效率很低下

    選擇排序
    默認了0 最大  100    zuidaxiabiao = 0  zuidashu = 100
    0   和  1 位置上的數比較,發現0大, 不換
    0   和  2位置上的數比較, 發現 0大,不換
    。。。。。。
    0 和 7比較, 0比較大,0和7交換位置
    50 2 3 23 66 98 18 100


    預設0最大   zuidaxiaobiao=0  zuidashu= 50
    0 和 1 比較   0最大
    。。。。
    0 和4比較   4比較大    預設4最大
    4 和5比較   5比較大     預設5最大
    5 和 6比較  5比較大   5和6就交換位置
    **/

    int arr[] = new int[50000];

    for(int i=0; i<arr.length; i++) {
        arr[i] = new Random().nextInt(100000);
    }
    Arrays.sort(arr);
    for(int i=0; i<arr.length; i++) {
        int zuidaxiabiao = 0;
        int zuidashu = arr[0]; // 100

        for(int j=1; j<arr.length; j++ ) {
            if(zuidashu > arr[j]) {
                //預設的0大
            }else {
                zuidaxiabiao = j;
                zuidashu = arr[j];
            }
            if( j == arr.length-1-i) {
                int temp = arr[zuidaxiabiao];
                arr[zuidaxiabiao] = arr[j];
                arr[j] = temp;  
            }   
        }   
    }



}

3.插入排序:
插入排序的理念就是先把陣列的第一個數作為一個數組,而是已經排序好的,從第二個開始去,通過和第一個陣列元素比較,選擇插入該資料到第一個陣列的合適位置

{100,3,2,660,23,98,18,50}

    public void chaRuPaiXu() {
    /**
        {[,3,2,66,23,98,18],[50]}
        插入排序:
        把當前陣列拆分成兩個陣列:

        {【,,,,】,【1,2,3,18,23,50,66,98】}


        {[,3,2,66,23,98,18],[50]}
        ,2,66,23,98,18,1,50
        2,66,23,98,18,1,3,50



        {100,3,2,660,23,98,18,50}


        [100] [100,2,660,23,98,18,50]

        num = 3 
        【2,3】【100,660,23,98,18,50】
        num = 2

        【2,3,100】【660,23,98,18,50】
        660
        【2,3,23,100】,【660,98,18..】
        23

        【2,3,23,100,660】【,98,18..】



    **/






        int arr[] = new int[100000];

        for(int i=0; i<arr.length; i++) {
            arr[i] = new Random().nextInt(100000);
        }

        for(int i=1; i<arr.length; i++) {  // i = 3
            int j = i;        //j=4
            int num = arr[i];   //num = 23

            while(j>0&& num<arr[j-1]) { // arr[3] = 660
                arr[j] = arr[j-1];  //    
                j--;                //

            }

            arr[j] = num;      //2  3  100  660  23

        }

    }

但是,這些我們編寫的演算法效率都很低下,java預設使用二叉樹排序,效率很高,所以一般我們隊陣列進行排序都使用java的工具排序

//java自帶排序演算法
        Arrays.sort(arr);

二分查詢法,二分查詢法的原理就是將陣列進行排序,然後在通過和中間數的對比大小,判斷我們要查詢的資料時在左邊還是右邊,依次迴圈,從而放棄原來逐個比較的原則

public void erFenChaZhao() {
        int arr[] = {2,66,23,98,18,1,3,50};
        //100000000000   52

        //   0 1 2 3   4  5   6 7

        //  9  > #

        //(4+7)/2 = 3
        /*
        for(int i=0 ;i<arr.length; i++) {
            if(arr[i] == 9) {
                System.out.println("9這個數在"+i+"位置上!");
            }
        }
        */
        Arrays.sort(arr);
        for(int i=0 ;i<arr.length; i++) {

                System.out.println(arr[i]);

        }
        //{1,2,3,18,23,50,66,98};
        int n = 66;
        int zuobian = 0;
        int youbian = arr.length; // 7
        for(int i=0;i<arr.length; i++) {
            int zhongjian = (zuobian + youbian)/2;
            int num = arr[zhongjian]; //18
            if(n>num) {
                zuobian = index-1;
            }else if(n<num) {
                youbian = index+1;
            }else {
                System.out.println(n+"在低" +zhongjian +"個位置");
                break;
            }

        }



    }