1. 程式人生 > >Java陣列之反轉、排序、折半查詢

Java陣列之反轉、排序、折半查詢

陣列的運用

1.通過角標查詢對應的元素
需求: 封裝一個函式 傳入數字1 返回  數字2 返回 ....
    // 查表法
    public static char findArray(int a) {
        char[] array = new char[] {'', '', '', '', ''};
        // 按角標 返回對應字元
        return array[a - 1];
    }
    
    public static void main(String[] args) {
        System.out.println(fun(1
)); } 2.通過元素查詢該元素在陣列中得位置(角標) 需求:封裝一個函式 定義一個數組 陣列值分別 3,6,11,22,查詢22的角標 // 為了讓方法的使用性更強,可以把陣列也當引數傳進來 public static int fun(int a, int[] array) { int l = -1; // 遍歷查詢 元素對應角標 for(int i=0; i < array.length; i++) { // 有可能你傳入的值不在陣列中,可能會沒有返回值 if(array[i] == a) { l = i; } } return
l; } public static void main(String[] args) { int[] array = new int[] {3, 6, 11, 22}; System.out.println(fun(22,array)); }

陣列元素反轉

如何交換?
例如: 需求 交換兩個整數
    int a = 10;
    int b = 15;
    int temp = 0;
    temp = a;
    a = b;
    b = temp;
    
陣列元素反轉(即將陣列中的值倒過來) 
分析:
    1. length/2 整數次
2.第一個數和最後一個數換 一次換... : array[0] array[length - 1 - 0] array[1] array[length - 1 - 1] array[2] array[length - 1 - 2] ... 結論:array[i] array[length -1 -i] 相互交換 : 定義一個長度為5的陣列,並將陣列元素反轉 public static void reverse(int[] array) { for(int i = 0; i < array.length / 2; i++) { // 陣列元素交換 int temp = array[i]; array[i] = array[array.length - 1 - i]; array[array.length - 1 - i] = temp; } System.out.println(Arrays.toString(array)); } public static void main(String[] args) { int[] array = new int[] {1, 2, 3, 4, 5}; // 這裡做的是一個地址的傳遞 reverse(array); } 寫一個交換兩個整數的方法,無法實現交換,是因為做的只是一個值的快遞,並沒有給main函式地址,: public static void reverseNum(int a, int b) { int temp = a; a = b; b = temp; } public static void main(String[] args) { int a = 10; int b = 15; // 這裡做的是一個 值的傳遞 reverseNum(a, b); System.out.println("a = " + a); System.out.println("b = " + b); }

陣列排序

氣泡排序

氣泡排序核心思想:相鄰兩個數進行比較,交換位置
分析:
int[] array = new int[]{3, 2, 5, 1}
3       2   5   1
第一趟     比較完畢,確定一個最大值,放到最後
第一次:2   3   5   1
第二次:2   3   5   1
第三次:2   3   1   5

length - 1 - 0

第二趟
比較完畢,確定一個最大值,放到最後
第一次:2   3   1   5
第二次:2   1   3   5

length - 1 - 1

第三趟   
比較完畢,確定一個最大值,放到最後
第一次:1   2   3   5

length - 1 - 2

例項:
    int[] array = new int[] {3, 2, 5, 1}
    // 外迴圈相當於比較多少趟,-1代表比較陣列長度-1
    for(int i = 0; i < array.length - 1; i++) {
        // 內迴圈相當於一趟比較多少次,-i相當於每趟都少比一次(注意內迴圈-1 防止陣列越界)
        for(int j = 0; j < array.length - 1 - i; j++) {
            if(array[j] > array[j+1]) {
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(array));

選擇排序

選擇排序的核心思想:選擇一個數,一次和後面的數比較 換位
分析:
array[0] --- array[1]       array[2]        array[3]
array[1] --- array[2]       array[3]
array[2] --- array[3]

例項:
		int[] array = new int[] {3, 2, 1, 5};
		// 外迴圈 -1 相當於 比較長度-1
		for (int i = 0; i < array.length -1; i++) {
			// 內迴圈  1+i把不需要比較的去除 array[0]  array[0]
			for (int j = i + 1; j < array.length; j++) {
				if(array[i] > array[j]) {
					int temp = array[i];
					array[i] = array[j];
					array[j] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(array));

折半查詢(提高效率的查詢)

折半查詢前提:在陣列中查詢,查詢這個數在陣列中得角標
注意:在有序的陣列中查詢

: 查詢陣列 int[] array = new int[]{3,5,6,9,12,18,22,33} 22的角標
    int[] array = new int[]{3, 5, 6, 9, 12, 18, 22, 33};
    // 宣告最大 最小 中間 角標
    int min = 0;
    int max = array.length - 1;
    int mid = (max + min) / 2;
    // 要查詢的值
    int key = 22;
    // 迴圈結束條件 key == array[mid]
    while(key != array[mid]) {
        // 比較 如果比中間角標大 挪動小角標
        // 比較 如果比中間角標小 挪動大角標
        if(key > array[mid]) {
            min = mid + 1;
        } else if(key < array[mid]) {
            max = mid - 1;
        }
        // 挪動完角標後 還要進行折半操作
        mid = (max + min) / 2;
        // 當最大角標小於最小角標的時候,說明陣列中沒有這個數
        if(max < min) {
            // 進到這裡說明沒有這個數,停止迴圈
            mid = -1;
            break;
        }
    }
    System.out.println("這個數的角標是:" + mid);