1. 程式人生 > 其它 >5、順序表查詢:順序查詢與折半查詢

5、順序表查詢:順序查詢與折半查詢

1、順序查詢

按照順序一個一個比較,查詢需要的值。

程式碼實現:

時間複雜度:T(n) = O(n)

空間複雜度:S(n) = O(1)

    static int findKey(int[] arr,int obj){
        for(int i = 0;i< arr.length;i++){
            if(arr[i]==obj) return i;
        }
        return -1;
    }

2、折半查詢

前提:

  1、必須是順序表儲存結構。

  2、被查詢的表必須按關鍵字大小有序排列。

程式碼實現(非遞迴):

時間複雜度: T(n) = O( log2

n)

空間複雜度: S(n) = O(1)

    static int find2(int[] arr,int i){
        //
        int head = 0;
        //
        int tail = arr.length-1;
        //
        int mid = (head+tail)/2;

        //折半查詢
        while (head<=tail){
            if(arr[mid]==i){ //找到了
                return mid;
            }else
if(arr[mid]>i){//中間值大於要查詢的值,則尾部前移 tail = mid -1; mid = (head+tail)/2; }else if(arr[mid]<i){//中間值小於要查詢的值,則頭部後移 head = mid +1; mid = (head+tail)/2; } } return -1; }

程式碼實現(使用遞迴):

時間複雜度:T(n) = O( log2

n )

空間複雜度:S(n) = O( log2n )

    public static int find3(int[] arr, int value){
        return  find3(arr,value,0,arr.length-1);
    }
    private static int find3(int[] arr, int value, int head, int tail){
        int mid = (head+tail)/2;

        if(head<=tail) {
            if (arr[mid] == value) { //找到了
                return mid;
            } else if (arr[mid] > value) {//中間值大於要查詢的值,則尾部前移
                return find3(arr, value, head, mid - 1);
            } else if (arr[mid] < value) {//中間值小於要查詢的值,則頭部後移
                return find3(arr, value, mid + 1, tail);
            }
        }
        return -1;
    }