1. 程式人生 > >Java學習路程之陣列與排序(氣泡排序、選擇排序、折半查詢)

Java學習路程之陣列與排序(氣泡排序、選擇排序、折半查詢)

一.陣列
1.一維陣列:儲存一組相同資料型別的元素.
2.陣列的三種宣告方式

    array為陣列的命名
    資料型別表示的是陣列中元素的資料型別
    int[] array = new int[陣列長度];
    int[] array = new int[] {1,2,3};
    int[] array = {1,23};
    獲取陣列的長度:array.length

3.堆區和棧區
棧:由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等.
棧區特點:
1.所有的函式執行的時候都會進入棧區當中,函式執行完畢之後,會自動出棧銷燬.
2.遵循先進後出的原則
堆:一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收 。
堆區特點:
1.堆記憶體會分配記憶體地址
2.堆記憶體會分配初值,基本資料型別的初值為哦0,引用資料型別的初值為null.
3.垃圾回收機制(一塊記憶體沒人使用,就會成為垃圾,在某一時候系統會自動回收)

public class Day04 {
    public static void main(String[] args) {

        //注意:陣列的長度一旦確定就不能改變
        //關鍵詞new表示會在堆記憶體中開闢一塊空間如圖:
        //陣列會在堆記憶體當中開闢一塊連續的記憶體空間
        //宣告陣列可以儲存五個int元素
        int[] array = new int[5];
        //如何給陣列賦值中的元素
        //使用下標對陣列元素進行賦值和取值,下標從0開始
        //陣列名[下標] = 值;
        array[3
] = 10; System.out.println(array[3]); //ArrayIndexOutOfBoundsException下標越界異常 array[5] = 15; System.out.println(array[5]); array = null;//把array儲存的地址指向空 //NullPointerException(空指標異常,訪問了不屬於你的記憶體區域) array[3] = 3; System.out.println(array[3]); ![陣列在棧和堆的執行機制](https://img-blog.csdn.net/20180823192519810?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2w3MTA4MjA3NDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
} }

練習1:
檢視陣列中的每一個元素(遍歷陣列)

int[] array1 = {1, 2, 3, 4, 5};
public class Day04 {
    public static void main(String[] args) {
        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1[i]);
        }
    }
}

練習2:
需求: 隨機10個數 隨機的區間為[15,150]
1.把這個10個數放入陣列中
2.列印最大值/最小值

public class Day04 {
    public static void main(String[] args) {
        int[] array2 = new int[10];
        int max = 0;//宣告最大值
        int min = array2[0];//宣告最小值可以宣告陣列中的某一元素
        for (int i = 0; i < 10; i++) {
            //隨機一個[15,150]之間的數
            int num = (int)(Math.random() * (150 - 15 + 1) + 15);
            array2[i] = num;
            //判斷求最大值
            if (array2[i] > max) {
                max = array2[i];
            }
            //判斷求最小值
            if (array2[i] < min) {
                min = array2[i];
            }
        }
        System.out.println("最大數:"+ max);
        System.out.println("最小數:" + min);
        //Arrays是陣列工具類,可以列印陣列.
        System.out.println(Arrays .toString(array2));
    }
}

練習3:
根據下標查詢對應的元素
需求: 封裝一個函式 傳入數字1 返回 一 數字2 返回 二 ….. 數字5 返回 五

public class Day04 {
    public static void main(String[] args) {
        System.out.println(findKeyIndex(1));
    }
    public static char findKeyIndex(int n){
        //宣告char型別的陣列
        char[] array = {'一', '二', '三', '四', '五'};
        return array[n - 1];
    }
}

練習4:
需求:分裝一個函式:
定義一個數組 陣列值 分別 3,6,11,22
在陣列中 查詢 11的位置

public class Day04 {
    public static void main(String[] args) {
        int[] array = {3, 6, 11, 22};
        int num = findIndex(array,11);
    }
    public static int findIndex(int[] array,int n){
         //宣告一個變數儲存下標
         int index = -1;
         for (int i = 0; i < array.length; i++) {
             //查詢 相同的元素
            if (array[i] == n) {
                index = i;
            }
        }
         return index;
     }
}

練習5:
陣列元素的反轉
基本資料型別引數傳遞時是值的傳遞,引用資料型別比如陣列引數傳遞時是地址的傳遞

public class Day04 {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 6, 8};
        reverse(array);
        //注意:交換兩個元素的值分裝的函式不能呼叫之後,在列印它們的值
        System.out.println(Arrays .toString(array));
    }
    private static void reverse(int[] array) {
        int temp;
        for (int i = 0; i < (int)(array.length/2); i++) {
            temp = array[i];
            array[i] = array[array.length - 1 - i];
            array[array.length - 1 - i] = temp;
        }
    }
}

二,氣泡排序
核心:依次交換陣列中相鄰元素的值
每比一個迴圈確定了比較元素中最大的數
外層迴圈控制比較的次數,內層迴圈控制一輪比較多少次
外層迴圈減一表示迴圈比較的次數
內層迴圈減一表示防止角標越界
內層迴圈減i表示每次外層迴圈後內層迴圈次數少一次

public class Day04 {
    public static void main(String[] args) {
        int[] array = {3, 2, 5, 1, 2, 9};
        int temp;
        for(int i = 0; i < array.length - 1; i++){
            for(int j = 0; j < array.length - 1 - i; j++){
                if(array[j] > array[j + 1]){
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(array));
    }
}
//輸出:
{
[1, 2, 2, 3, 5, 9]
}

三.選擇排序
核心:選擇一個數與其他的數進行比較交換,一般選第一個數

public class Day04 {
    public static void main(String[] args) {
        //外迴圈減一是五個數比四趟
        //內迴圈1+i表示每一趟確定有一個數不再比較
        int[] array = {3, 2, 5, 1, 2, 9};
        int temp;
        for(i = 0; i < array.lengh - 1; i++){
            for(j = 1 + i; j < array.length; j++){
                if(array[i] > array[j]){
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toStrring(array));
    }
}

四.折半查詢

折半查詢:在陣列中根據元素查詢對應的角標
前提:必須在有序的陣列中查詢
public class Day04 {
    public static void main(String[] args) {
        int[] array = {1, 10, 20, 30, 40, 50, 55, 60, 78, 90};
        int max = array.length - 1;//最大角標
        int min = 0;最小角標
        int mid = (max + min)/2;折半角標
        int num = 55;
        //有明確的迴圈結束條件用while迴圈
        while(array[mid] != num){
            if(array[mid] > num){
                max = mid - 1;
            }
            if(array[mid] < num){
                min = mid + 1;
            }
            //判斷陣列中有沒有這個值
            mid = (max + min)/2;
            if(min > max){
                mid = -1;
                break;
            }
        }
        System.out.println(mid);
    }
}