1. 程式人生 > >Java陣列中陣列的運用與陣列排序、折半查詢

Java陣列中陣列的運用與陣列排序、折半查詢

    注: array.length 代表陣列長度 length代表的就是長度

陣列的運用

 1.通過角標 查詢對應的元素

 例如:封裝一個函式 傳入數字1 返回 一 數字2 返回二...

    public static void main(String[] args) {
        System.out.println(fun(3));
    }
    public static char fun(int index) {//定義一個函式(方法)
        char[] array = new char[] {'一', '二', '三', '四', '五'};//定義一個數組 
// 按角標返回對應的字元 return array[index - 1]; //由於 陣列的角標是從0開始的 如果不減1 那麼傳入一個1 返回的可能就是二 了 } 2.通過元素 查詢該元素在陣列中的位置(角標) 例如: 封裝一個函式 定義一個數組 陣列值 分別為 3,6,11,22 傳入11 查詢對應的位置 public static void main(String[] args) { int[] array = new int[] {3, 6, 11
, 22};//定義一個數組 int index = fun(22, array);//定義一個變數 接收這個方法 System.out.println(index);//輸出角標為多少 } //為了讓方法的使用性更強,可以把陣列也當引數傳進來 public static int fun(int index, int[] array) {//定義一個有引數 有返回值的函式 //定義變數 儲存角標 int a = -1; for (int i = 0; i < array.length; i++) { //遍歷查詢 元素對應角標 //有可能你傳入的值 不在陣列中 可能會沒有返回值
if (array[i] == index) { //如果找到對應的值 就儲存一下 a = i; } } return a;//返回一個a }

陣列元素的反轉

    陣列元素的反轉 也就是 將陣列中的值 倒過來
    例如:
    1 2 3 4 5 反轉成為 5 4 3 2 1

    如果要將陣列中的值倒過來 那麼就代表
    第一個值和最後一個換
    第二個值和倒數第二個換
    第三個值和倒數第三個換
    ...
    也就是
    array[0] 和 array[length - 1] 換
    array[1] 和 array[length - 1 - 1] 換
    array[2] 和 array[length - -1 - 2] 換
    從這裡我們分析出:
    array[i] 和 array[length - 1 - i]換

    那麼換幾次呢? 
    例如 1 2 3 4 5 
    1524 換
    例如 1 2 3 4 5 6 7
    172635 換
    從而得出 需要交換 length / 2 整數次

    那麼 如何交換

    這時 我們可以利用中間值來交換

    例如:
    //交換兩個整數
    int a = 5;
    int b = 10;
    int mid = 0;
    mid = a;
    a = b;
    b = mid

    來達到交換的目的

    例如:
    反轉陣列 1 2 3 4 5

    public static void main(String[] args) {
    int[] array = new int[] {1, 2, 3, 4, 5};//定義陣列
        //這裡做的是一個 地址 的傳遞
        reverse(array);
        //遍歷陣列的方法
        System.out.println(Arrays.toString(array));//列印陣列的方法
    }

    public static void reverse(int[] array1) {
        //交換的次數
        int num = array1.length / 2;
        for (int i = 0; i < num; i++) {//遍歷查詢
            //陣列元素 交換
            int temp = 0;
            temp = array1[i];
            array1[i] = array1[array1.length - 1 - i];
            array1[array1.length - 1 - i] = temp;
        }
    }

    那麼 可以用方法反轉陣列 可不可以用方法反轉整數呢?

    例如:

    public static void main(String[] args) {

        int x = 10;
        int y = 5;
        // 這裡做的是 一個 值 的傳遞
        reverseNum(x, y);
        System.out.println("x = " + x);
        System.out.println("y = " + y);
        }
        public static void reverseNum(int a, int b) {
        int temp = a;
        a = b;
        b = temp;

    }

    將這段程式碼輸入並執行時 發現並不能反轉 

    因為陣列儲存的是一個地址  main函式中定義的地址 
    而reverse(array)這一步代表 
    將main函式中陣列的地址 轉遞給 reverse 方法
    所以 main函式 和reverse 可以呼叫相同地址的陣列
    所以可以進行反轉
    而reverseNum這個方法中 並沒有什麼可以和main函式共同使用的
    當 reverseNum 這個方法呼叫完以後 就出棧了
    然後再繼續進行main函式的呼叫
    所以這兩個整數 並不能反轉

陣列排序之氣泡排序

    氣泡排序其實就是按照什麼思想去排序(例如:升序或者降序)

    核心排序思想: 相鄰兩個數 進行比較 交換位置

    例如:
    一個數組中的元素為: 3 2 5 1 
    將這個陣列進行氣泡排序

    因為是相鄰兩個數 進行比較 交換
    也就是說

    第一次 2 3 5 1 第一個和第二個比較後 交換
    第二次 2 3 5 1 第二個和第三個比較  這時第二個已經被交換 變成 33 < 5 所以不交換
    第三次 2 3 1 5 第三個和第四個比較 這時已經確定了一個最大值 而且放到了陣列的最後

    但是這時陣列還沒有完成比較 交換 我們稱 上面的步驟為 第一趟

    那麼 第二趟:
    第一次 2 3 1 5 第一個和第二個比較 2 < 3 所以不交換
    第二次 2 1 3 5 第二個和第三個比較 3 > 1 所以交換
    由於 5 已經確定為最大值 所以 第三個和第四個已經不用比較
    這時也確定了倒數第二大的數放在倒數第二個位置

    第三趟
    第一次 1 2 3 5 第一個和第二個比較 2 > 1 所以交換
    這時也確定了倒數第三大的數放在倒數第三個位置


    例如:
    將陣列 3 5 4 7 1 9 2 8 進行氣泡排序
    public static void main(String[] args) {
        int temp = 0;
        int[] array = new int[] {3, 5, 4, 7, 1, 9, 2, 8};
        //  1.把雙層迴圈結構搭出來
        //  注意 內迴圈 -1 防止陣列越界
        //  外迴圈 - 1 代表比較陣列長度 - 1 趟 (5個數 比較4趟)
        //  內迴圈 - i 相當於 每一趟 都少比一次
        //  外迴圈 相當於 比較多少趟
        //  內迴圈 相當於  一趟 比較多少次
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                //  2.相鄰 兩個數比較 交換
                if (array[j] > array[j + 1]) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
//      列印陣列的方法
        System.out.println(Arrays.toString(array));
        }

陣列排序之選擇排序

    選擇排序核心思想:
    選擇一個數 依次和後面的數 比較 換位(一般選擇第一個數)

    例如:
    將陣列 3 5 1 4 進行選擇排序

    第一趟
    第一次 3 5 1 4 第一個和第二個比
    第二次 1 5 3 4 第一個和第三個比
    第三次 1 5 3 4 第一個和第四個比
    確定了最小值在第一位
    第二趟
    第一次 1 3 5 4 第二個和第三個比
    第二次 1 3 5 4 第二個和第四個比
    確定了第二小在第二位
    第三趟 1 3 4 5 第三個和第四個比
    確定第三小在第三位

    public static void main(String[] args) {
        int[] array = new int[] {3, 5, 1, 4};//定義一個數組
        int temp = 0;//定義一個變數 用於 元素交換
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = i + 1; j < array.length; j++) {
                //外迴圈 - 1 相當於 比較 長度 - 1 趟(5個數 就比較 4 趟)
                //內迴圈 1 + i  相當於 把不需要比較的去除 (array[0] 和 array[0])
                //                   每一次 確定一個數
                if (array[i] > array[j]) {//由於
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }

折半查詢

    折半查詢的前提是 :
    在一個有序的陣列中查詢 一個數在陣列中的角標
    注意: 要在有序的陣列中 查詢

    例如:
    查詢 陣列元素為 3 5 6 9 12 18 22 33 5522的角標
    public static void main(String[] args) {
        int[] array = new int[] {3 , 5, 6, 9, 12, 18, 22, 33, 55};
        // 把 要用到的變數 全部宣告一遍
        // 宣告最大 最小 中間角標
        int min = 0;//最小角標
        int max = array.length - 1;//最大角標 由於角標從0開始 所以最大角標是長度 -1
        int mid = (array.length - 1) / 2;
        // 要查詢的值
        int key = 22;
        /*
         * 迴圈查詢
         * array[mid] != key
         */
        while (key != array[mid]) {
            //比較 如果比中間角標大 挪動 最小角標
            //    如果比中間角標小 挪動 最大角標
            if (key > array[mid]) {
                min = mid + 1;
            }else if (key < array[mid]) {
                max = mid - 1;
            }
            // 挪動完角標後 還要進行折半操作
            mid = (min + max) / 2;
            //當最大角標 小於 最小角標的時候 說明 陣列中 沒有這個數
            if (max < min) {
                //進到這裡 說明 沒這個數 就停止迴圈
                mid = -1;
                break;
            }
        }
        System.out.println("這個數的角標是: " + mid );
    }

                                                                  Day.3