1. 程式人生 > 其它 >多維陣列、Arrays類、稀疏陣列、氣泡排序

多維陣列、Arrays類、稀疏陣列、氣泡排序

多維陣列

  • 多維陣列可以看成是陣列的陣列
  • 比如二維陣列就是一個特殊的一堆陣列
  • 其中每個元素就是一個數組。
  • 二維陣列:
int a[][] = new int[2][5];
  • 解析:二維陣列a可以看成一個兩行三列的陣列。
  • 思考:多維陣列的使用?
num[1][0];

(

  • 程式碼練習:
package com.guoba.Array;

public class Demo05 {
    public static void main(String[] args) {
        /*
        1,2     array[0]    00   01
        2,3     array[1]    10   11
        3,4     array[2]    20   21
           */
        int[][] array = {{1,2},{2,3},{3,4}};
        printArray(array[0]);//列印二維陣列中第一個元素的值
        System.out.println();
        System.out.println("==========================");
        System.out.println(array[0][0]);//1
        System.out.println(array[0][1]);//2
    }
    //列印陣列元素
    public static void printArray(int[] arr){
        for (int j = 0; j < arr.length; j++) {
            System.out.print(arr[j]+" ");
        }
    }
}

package com.guoba.Array;

public class Demo06 {
    public static void main(String[] args) {
        //遍歷列印多維陣列的值
        int[][] array = {{1,2},{2,3},{3,4}};
        for (int i = 0; i < array.length ; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]+"\t");
            }

        }
    }
}

Arrays類

Arrays類

  • 陣列工具類java.util.Arrays
  • 由於陣列物件本身並沒有什麼方法可以供我們呼叫,
  • 但API中提供了一個工具類Arrays供我們使用
  • 從而可以對資料物件進行一些操作
  • 檢視JDK幫助文件
  • Arrays類中的方法都是static修飾的靜態方法
  • 在使用的時候可以直接使用類名進行呼叫
  • 功能:
  • 》給陣列物件賦值:通過fill方法
  • 》對陣列進行排序:通過short方法,升序
  • 》比較陣列:通過equals方法比較陣列中的元素值是否相等。
  • 》查詢陣列元素:通過binarySearch方法能對排序好的陣列進行二分法查詢操作
package com.guoba.Array;

import java.util.Arrays;

public class Demo07 {
    public static void main(String[] args) {
        int[] a = {1,2334,324,54,4,6,546,5,7,7,7,34,34324};
        System.out.println(a);
        //列印陣列元素
        System.out.println(Arrays.toString(a));
        //自定義方法,與toString效果相同。
        arrayPrint(a);
        Arrays.sort(a);//對陣列進行排序
        System.out.println(Arrays.toString(a));
    }
    public static void arrayPrint(int[] a){
        for (int i = 0; i < a.length; i++) {
            if (i == 0){
                System.out.println("[");
            }
            if (i == a.length){
                System.out.println(a[i]+"]");
            }else {
                System.out.println(a[i]+", ");
            }
        }
    }
}

氣泡排序

  • 最為出名的排序演算法之一
  • 程式碼是兩層
  • 迴圈外層冒泡輪數
  • 裡層依次比較
  • 巢狀迴圈 》時間複雜度為O(n2).
  • 思考:如何優化?
  • 》加個判斷若是排好的則直接跳出迴圈

程式碼如下:

package com.guoba.Array;

import java.util.Arrays;

public class Demo08_maopao {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        int[] sort = sort(array);//呼叫我們自己寫的氣泡排序
        System.out.println(Arrays.toString(sort));//使用工具類的toString輸出
    }
    //氣泡排序
    //1.比較陣列中,兩個相同的元素,如果第一個數比第二個數大,則互換位置
    //2.每一次比較,都會產生出一個最大最小的數字
    //3.下一輪可以減少一次排序
    //4.依次迴圈,直到結束

    public static int[] sort(int[] array){
        int temp = 0;
        //外層迴圈,判斷我們要走多少次(輪數);
        for (int i = 0; i < array.length-1; i++) {
            boolean flag = false;//優化,若排好,則少走一層
            for (int j = 0; j < array.length-1-i; j++) {
                if (array[j+1]>array[j]){
                    temp =array[j+1];//藉助第三方臨時變數交換兩個陣列元素的值
                    array[j+1] = array[j];
                    array[j] = temp;
                }
            }
            if (flag == false){
                break;
            }
        }
        return array;
    }
}

稀疏陣列

  • 需求:編寫五子棋遊戲中,有存檔退出和續上盤的功能。
  • 分析問題:因為該二維陣列很多預設值都為0,因此記錄了很多沒用的資料。
  • 解決:稀疏陣列
  • 場景:當一個數組中大部分元素為0,或者為同一值的陣列時,可以用稀疏陣列來儲存。
  • 處理方式:
  • 》記錄陣列一共有幾行幾列,有多少個不同值。
  • 》把具有不同值的元素及行列及值記錄在一個小規模陣列中,從而縮小程式規模。
  • 如下圖,左邊為原始陣列,右邊為稀疏陣列。

(

)

程式碼練習如下:

package com.guoba.Array;

/**
 * 利用稀疏陣列,存放棋盤黑白子資訊,避免普通陣列存放大量無用資訊
 * 思路:利用稀疏陣列只存放有效值,記錄他們的座標。
 * 步驟:
 * 1.建立一個棋盤11*11(建立二維陣列11*11) 1:黑子 2:白子0:沒有棋子
 * 2.輸出這個原始陣列
 * 3.轉換為稀疏陣列
     * 》獲取有效值個數
     * 》建立一個稀疏陣列的陣列
     * 》遍歷二維陣列,將非零的值存放到二維陣列中。
 * 4.遍歷、輸出稀疏陣列
 *
 * 思考:能不能還原它?
 * 當然能,我們按照這個思路,首先還是遍歷這個稀疏陣列,然後把拿到的值存放到一個新的數組裡
 * 1.讀取稀疏陣列
 * 2.給其中的元素還原它的值
 */
public class Demo09 {
    public static void main(String[] args) {
        //1.建立一個棋盤11*11(建立二維陣列11*11)0:沒有棋子  1:黑子 2:白子
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;//一黑子
        array1[2][3] = 2;//一白子
        //2.輸出這個原始陣列
        System.out.println("輸出這個原始陣列");
        for (int[] ints:array1) {
            for (int anInt:ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        //3.轉換為稀疏陣列
        //(1)獲取有效值個數
        int sum = 0;//存取有效值,預設設為0
        for (int i = 0; i <11 ; i++) {
            for (int j = 0; j <11 ; j++) {
                if (array1[i][j] != 0){
                    sum++;//若遍歷出的值不為0,則有效值加1
                }
            }
        }
        System.out.println("==================================");
        System.out.println("有效值個數:"+sum);
        //建立一個稀疏陣列的陣列
        int[][] array2 = new int[sum+1][3];
        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;
        //遍歷二維陣列,將非零的值存放到二維陣列中。
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j] != 0){
                    count++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }
        }
        //4.遍歷、輸出稀疏陣列
        System.out.println("輸出稀疏陣列");
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0]+"\t"+ array2[i][1]+"\t" + array2[i][2]+"\t");
        }
        //還原稀疏陣列
        System.out.println("==================================");
        System.out.println("還原");
        //1.讀取稀疏陣列
        int[][] array3 = new int[array2[0][0]][array2[0][1]];
        //2.給其中的元素還原它的值
        for (int i =    1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        //列印輸出
        System.out.println("輸出這個還原陣列");
        for (int[] ints:array3) {
            for (int anInt:ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}