泛型化的折半查詢

sanqima發表於2014-06-05

    折半查詢要求資料集合中的元素必須可比較,並且各元素按升序或者降序排列。折半查詢的基本思想如下:

取集合的中間元素作為比較物件,則:

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

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

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

重複上述過程,直至查詢成功。折半演算法的平均時間複雜度是

設計過程:

   編寫BinSearch類,它有兩個方法:search()方法用來在給定的陣列array中,查詢key的索引位置;

main()方法用來進行測試。程式碼如下:

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));
    }
}

效果如下:

程式設計心法:

    泛型在資料結構中的應用。

    在學習資料結構的過程中,為了理解方便和簡化程式設計,通常都使用整數作為分析的物件。利用Java的泛型機制,只需要將int替換成泛型型別T就可以實現更加通用的演算法。

這樣就不需要再對不同的資料型別編寫不同的演算法實現。

相關文章