如何使用排序列表的二进制搜索,然后计算比较

时间:2018-01-28 20:11:44

标签: java search binary

我正在尝试使用我的排序列表并使用二进制搜索来实现它。然后我想计算找到密钥所需的比较次数。我的代码是:

public class BinarySearch {
    private static int comparisions = 0;

    public static void main(String[] args) {
        int [] list = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

        int i = BinarySearch.BinSearch(list, 20);

        System.out.println(comparisions);
    }

    public static int BinSearch(int[] list, int key) {
        int low = 0;
        int high = list.length - 1;
        int mid = (high + low) / 2;

        if (key < list[mid]) {
            high = mid - 1;
            comparisions++;
        } else if (key == list[mid]) {
            return mid;
            comparisions++;  
        } else {
            low = mid + 1;
            comparisions++;
        }

        return -1;          
    }
} 

到目前为止,无论关键是什么数字,它只给我一个比较。

1 个答案:

答案 0 :(得分:0)

您的代码缺少搜索的循环部分,循环可以使用递归或使用while循环完成。在这两种情况下,你都要问自己是否只是想要知道计数或实际返回比较计数。由于您的方法现在返回索引,因此无法轻松返回比较计数。为此,您需要返回两个整数的数组或自定义class IndexAndComparisonCount { ... }

如果使用递归方法,则需要在进行比较时递增,当您进行递归调用时,需要获取该递归调用的返回值并增加compareCount返回的调用1:

if (... < ...) {
    IndexAndComparisonCount ret = BinSearch(...);
    ret.comparisonCount += 1;
    return ret;
} else if (... > ...) {
    IndexAndComparisonCount ret = BinSearch(...);
    ret.comparisonCount += 2; // since you did compare twice already
    return ret;
} else {
    return new IndexAndComparisonCount(mid, 2); // you compared twice as well
}