查找

二分查找

二分查找的时间复杂度为O(logn)

要求:查找的序列是有序的

package com.dy.xidian;

public class BinarySearch {
private int[] arr;
public BinarySearch(int[] _arr){
arr
= _arr;
}

</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) {
    </span><span style="color: #0000ff">int</span>[] arr = {7, 10, 13, 16, 19, 29, 32, 33, 37, 41, 43, 48<span style="color: #000000">};
    BinarySearch bs </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> BinarySearch(arr);
    System.out.println(bs.search(</span>19<span style="color: #000000">));
}

</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> search(<span style="color: #0000ff">int</span><span style="color: #000000"> key){
    </span><span style="color: #0000ff">int</span> low=0<span style="color: #000000">;
    </span><span style="color: #0000ff">int</span> high = arr.length-1<span style="color: #000000">;
    </span><span style="color: #0000ff">int</span> mid=0<span style="color: #000000">;
    </span><span style="color: #0000ff">while</span>(low &lt;=<span style="color: #000000"> high){
        mid </span>= low + (high - low)/2<span style="color: #000000">;
        </span><span style="color: #0000ff">if</span>(arr[mid] ==<span style="color: #000000"> key)
            </span><span style="color: #0000ff">return</span><span style="color: #000000"> mid;
        </span><span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(key &lt;<span style="color: #000000"> arr[mid])
            high </span>= mid -1<span style="color: #000000">;
        </span><span style="color: #0000ff">else</span><span style="color: #000000">
            low </span>= mid + 1<span style="color: #000000">;
    }
    </span><span style="color: #0000ff">return</span> -1<span style="color: #000000">;
}

}

mid = low +(high-low)/2是为了保证不会发生类型溢出的问题,如果mid=(low+high)/2的话,low+high可能会超出int类型的范围。

分块查找

基本思想:将查找表分为诺干个子块。块内的元素可以是无序的。但块之间是有序的,即第一个块中的最大关键字小于第二个块中所有记录值,第二个块中的最大关键字小于第三个块中的所有记录值,以此类推。再建一个索引表,索引表中的每个元素含有各块的最大关键字和各块中第一个元素的地址。

关键码集合为{88,24,72,61,21,6,32,11,8,31,22,83,78,54},按照关键码值为24,54,78,88,分为四个块和索引表。

image

索引表是有序的,1,7,10,13表明了索引表中的关键字在查找表中的位置

第一个块:24,21,6,11,8,22

第一个块:32,31,54

第三个块:72,61,78

第四个块:88,83

平均查找长度为ASL = log(b+1)+(s+1)/2,b为索引表中元素个数,s为对应块中元素个数

posted @ 2016-11-05 10:55  被罚站的树  阅读(309)  评论(0编辑  收藏  举报