1. 程式人生 > 其它 >三十九、排序與查詢

三十九、排序與查詢

1、氣泡排序

1.1 概述

氣泡排序:將一組資料按照升序規則進行排列

氣泡排序原理:相鄰的資料兩兩比較,小的放前面,大的放後面

注意:

  1. 如果有n個數據進行排序,總共需要比較n-1次
  2. 每一次比較完成,下一次的比較就會少一個數據參與

1.2 氣泡排序圖解

1.3 程式碼實現

public class ArrayDemo {
    public static void main(String[] args) {
        //定義一個數組
        int[] arr = {7, 6, 5, 4, 3};
        System.out.println("排序前:" + Arrays.toString(arr));

        // 這裡減1,是控制每輪比較的次數
        for (int x = 0; x < arr.length - 1; x++) {
            // -1是為了避免索引越界,-x是為了調高比較效率
            for (int i = 0; i < arr.length - 1 - x; i++) {
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        System.out.println("排序後:" + Arrays.toString(arr));
    }
}

2、選擇排序

2.1 概述

  • 每趟選出陣列 中的最小值,把值放在前面,直至所有資料按照要求完成排序
  • 如果有n個數據進行排序,總共需要比較n-1次
  • 每一次比較完畢,下一次的比較就會少一個數據參與

2.2 選擇排序圖解

2.3 程式碼實現

public class ArrayDemo {
    public static void main(String[] args) {
        //定義一個數組
        int[] arr = {7, 6, 5, 4, 3};
        System.out.println("排序前:" + Arrays.toString(arr));
        
  		// 這裡減1,是控制比較的輪數
        for (int x = 0; x < arr.length - 1; x++) {
            // 從x+1開始,直到最後一個元素
            for (int i = x+1; i < arr.length; i++) {
                if (arr[x] > arr[i]) {
                    int temp = arr[x];
                    arr[x] = arr[i];
                    arr[i] = temp;
                }
            }
        }
        
        System.out.println("排序後:" + Arrays.toString(arr));
    }
}

3、二分查詢

3.1 陣列的二分查詢步驟

  1. 定義兩個變數,表示要查詢的範圍。預設min = 0 , max = 最大索引
  2. 迴圈查詢,但是min <= max
  3. 計算出mid的值
  4. 判斷mid位置的元素是否為要查詢的元素,如果是直接返回對應索引
  5. 如果要查詢的值在mid的左半邊,那麼min值不變,max = mid -1.繼續下次迴圈查詢
  6. 如果要查詢的值在mid的右半邊,那麼max值不變,min = mid + 1.繼續下次迴圈查詢
  7. 當 min >= max 時,表示要查詢的元素在陣列中不存在,返回-1.

3.2 二分查詢圖解

假設有一個給定有序陣列(10,14,21,38,45,47,53,81,87,99),要查詢50出現的索引

則查詢過程如下圖所示:

3.3 二分查詢程式碼實現

public static void main(String[] args) {
    int[] arr = {10, 14, 21, 38, 45, 47, 53, 81, 87, 99};
    int index = binarySerach(arr, 38);
    System.out.println(index);
}
/**
         * 二分查詢方法
         * @param arr 查詢的目標陣列
         * @param number 查詢的目標值
         * @return 找到的索引,如果沒有找到返回-1
         */
public static int binarySerach(int[] arr, int number) {
    int start = 0;
    int end = arr.length - 1;

    while (start <= end) {
        int mid = (start + end) / 2;
        if (number == arr[mid]) {
            return mid ;
        } else if (number < arr[mid]) {
            end = mid - 1;
        } else if (number > arr[mid]) {
            start = mid + 1;
        }
    }
    return -1;  //如果陣列中有這個元素,則返回
}