1. 程式人生 > 其它 >二分查詢和優化氣泡排序

二分查詢和優化氣泡排序

  

二分查詢

何為二分查詢

1,前提:有已排序陣列 A (假設已經做好)

2.定義左邊界 L 、右邊界 R ,確定搜尋範圍,迴圈執行二分查詢(3、4兩步)

3.獲取中間索引 M = Floor (( L + R )/2)

4.中間索引的值 A [ M ] 與待搜尋的值 T 進行比較

① A [ M ]= T 表示找到,返回中間索引

② A [ M ]> T ,中間值右側的其它元素都大於 T ,無需比較,中間索引左邊去找, M - 1設定為右邊界,重新查詢

③ A [ M ]< T ,中間值左側的其它元素都小於 T ,無需比較,中間索引右邊去找, M + 1設定為左邊界,重新查詢

5.當 L > R 時,表示沒有找到,應結束迴圈

/***
 * 2分查詢
 */
public class HalfFind {
    public static void main(String[] args) {
        int[] arr = {1,11,24,33,45,48,56,68,69,73,77,83,85,90,99,107};
        int target = 99;
        System.out.println(halfFind(arr,target));
    }

    private static String halfFind(int[] arr, int target) {
        
// l:左邊界 r:右邊界 m:中間索引 int l = 0,r = arr.length-1,m; // 記錄查詢次數 int num = 0; // 如果左邊界大於右邊界說明沒有找到資料退出迴圈 while (l <= r) { num++; // m = (l + r) / 2; //使用右移1位 可以解決int最大數值資料溢位問題 不考慮大資料量可以直接使用 m = (l + r) / 2; m = (l + r) >>> 1;
if (arr[m] == target) { return "查詢"+num+"次,找到該元素的索引是:"+m; } else if (arr[m] > target) { //說明中間索引右側元素都大於target 右側不用比較 把右邊界改為 m-1 r = m - 1; } else { //說明中間索引左側元素都小於target 左側不用比較 把左邊界改為 m+1 l = m + 1; } } return "查詢"+num+"次,沒有找到該元素!"; } }

  

  氣泡排序

    一般氣泡排序都使用雙重for迴圈依次遍歷比對,這裡介紹一種記錄每次最後一次交換索引位置實現的方法,可以減少不必要的迴圈次數

/***
 * 氣泡排序
 */
public class BubbleSort {

    public static void main(String[] args) {
        // 原始陣列資料
        int[] arr = {7,2,11,30,26,32,46,57};
        bubbleSort(arr);
    }
    //排序方法
    public static void bubbleSort(int[] arr) {
        // 每次迴圈需要比較的次數 第一次是陣列長度-1
        int n = arr.length - 1;
        while (true) {
            // 用來記錄最後一次交換的索引的位置
            int last = 0;
            // 每次迴圈最大次數是上一次最後一次交換的索引的位置
            for (int i = 0; i < n; i++) {
                System.out.println("比較次數:"+(i+1));
                if (arr[i] > arr[i + 1]) {
                    // 如果前一個元素比後一個元素大交換元素的位置
                    swap(arr,i,i+1);
                    // 給最後一次交換的索引位置賦值
                    last = i;
                }
            }
            // 給下次迴圈次數賦值
            n = last;
            System.out.println("排序後陣列:"+ Arrays.toString(arr));
            if (n == 0) {
                // 如果下次迴圈次數是0結束迴圈
                break;
            }
        }
    }
    // 交換陣列位置方法
    public static void swap(int[] arr,int i,int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
}