首頁 > 軟體

Java利用泛型實現折半查詢法

2022-08-19 14:01:02

泛型化的折半查詢法

1.題目

泛型是JAVA重要的特性,使用泛型程式設計,可以使程式碼複用率提高。

實現:查詢作為泛型的一個簡單應用,使用泛型實現折半查詢法

2.解題思路

建立一個類:BinSearch。

折半查詢要求資料集合中的元素必須可比較,並且各元素按升序或降序排列。取集合的中間元素作為比較物件,如:

(1)如果給定的值與比較物件相等,則查詢成功,返回中間元素的序號。

(2)如果給定的值大於比較物件,則在中間元素的右半段進行查詢。

(3)如果給定的值小於比較物件,則在中間元素的左半段進行查詢。

3.程式碼詳解

package com.xiaoxuzhu;
import java.util.Arrays;
/**
 * Description:
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改記錄:
 * 修改後版本	        修改人		修改日期			修改內容
 * 2022/5/10.1	    xiaoxuzhu		2022/5/10		    Create
 * </pre>
 * @date 2022/5/10
 */


public class BinSearch {
    public static <T extends Comparable<? super T>>  int search(T[] array, T key) {
        int low = 0;
        int mid = 0;
        int high = array.length;
        System.out.println("查詢的中間值:");
        while (low <= high) {
            mid = (low + high) / 2;
            System.out.print(mid+" ");
            if (key.compareTo(array[mid]) > 0) {
                low = mid + 1;
            } else if (key.compareTo(array[mid]) < 0) {
                high = mid - 1;
            } else {
                System.out.println();
                return mid;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        Integer[] ints = {1,2,3,4,5,6,7,8,9,10};
        System.out.println("資料集合:");
        System.out.println(Arrays.toString(ints));
        System.out.println("元素3所對於的索引序號:"+search(ints, 3));
    }
}

知識點補充

折半查詢法是效率較高的一種查詢方法。假設有已經按照從小到大的順序排列好的五個整數a0~a4,要查詢的數是X,其基本思想是: 設查詢資料的範圍下限為l=0,上限為h=4,求中點m=(l+h)/2,用X與中點元素am比較,若X等於am,即找到,停止查詢;否則,若X大於am,替換下限l=m+1,到下半段繼續查詢;若X小於am,換上限h=m-1,到上半段繼續查詢;如此重複前面的過程直到找到或者l>h為止。如果l>h,說明沒有此數,列印找不到資訊,程式結束。

該方法是查詢的範圍不斷縮小一半,所以查詢效率較高。

下面將通過一個例題,帶大家深入瞭解一下折半查詢法

比如我買了一雙鞋,你好奇問我多少錢,我說不超過300元。你還是好奇,你想知道到底多少,我就讓你猜,你會 怎麼猜?

答案:你每次猜中間數。

程式碼實現:

//只適合有序的陣列
#include<stdlib.h>
#include<stdio.h>
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int left = 0;
    int right = sizeof(arr) / sizeof(arr[0]) - 1;
    int key = 7;
    int mid = 0;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (arr[mid] > key)
        {
            right = mid - 1;
        }
        else if (arr[mid] < key)
        {
            left = mid + 1;
        }
        else
        {
            break;
        }
    }
    if (left <= right)
        printf("找到了,下標是%dn", mid);
    else
        printf("找不到");
    system("pause");
    return 0;
}

如何實現一個二分查詢函數:

int bin_search(int arr[], int left, int right, int key)
{
    int mid = 0;
    while (left <= right)
    {
        int mid = (left + right) >> 1;
        if (arr[mid] > key)
            right = mid - 1;
        else if (arr[mid] < key)
            left = mid + 1;
        else
            return mid;
    }
    return -1;
}

到此這篇關於Java利用泛型實現折半查詢法的文章就介紹到這了,更多相關Java折半查詢法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com