二分查找

来源:互联网 发布:数据库具备的特性 编辑:程序博客网 时间:2024/06/04 23:18

二分查找:二分查找是很常见而且高效的查找方式,比普通查找速度快的多。普通查找:遍历数组和查询值进行比较;
                        二分查找:定义中间值和所查找值进行比较,小于中间值就查找中间值左边的值,大于则相反。
                  所以,二分查找要满足被查的数组是有序排列的。下面代码分别是普通查找,二分查找和递归实现的二分查找。

介绍

二分查找,又称折半查找,二分搜索,是一种在有序数组中查找某一特定元素的算法。优点是比较次数少,查找速度快,平均性能好;缺点是要求待查数组有序,且插入删除困难。因此二分查找适合于那些不经常变动而查找频繁的的有序列表。

假设数组中元素是有序的,搜索过程首先从数组的中间开始,如果中间元素刚好是要查找的元素,则搜索过程结束;否则利用中间位置记录的元素将数组分成前后两个字数组,如果某一特定元素大于或者小于中间元素,则在数组中大于或者小于中间元素的那一半查找,也从数组中间元素开始比较,重复以上步骤。

虽然第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现.

复杂度分析

因为二分搜索算法每一步都使搜索范围缩小一半,所以很明显时间复杂度是O(logn)

代码

二分查找在算法大家庭中属于"分治法",分治法基本都可以使用递归来实现。

递归实现如下:


public class Dichotomy {

        /**
         * 普通查找和二分查找法
         */
        public static void main(String[] args) {
                int[] num = { 15, 34, 36, 45, 52, 63 };
                Arrays.sort(num);
                int n = 45;
                // int j = findNum(num,n);
                // int j = DichotomybyCommon(num, n);
                int j = Dichotomybydigui(num, 0, num.length, n);
                System.out.println(j);
        }

        // 普通查找法
        public static int findNum(int[] num, int n) {
                for (int i = 0; i < num.length; i++) {
                        if (num[i] == n)
                                return i;
                }
                return 0;
        }

        // 普通二分查找
        @SuppressWarnings("unused")
        private static int DichotomybyCommon(int[] num, int n) {
                int left, right, among;
                left = 0;
                right = num.length - 1;
                while (left <= right) {
                        among = (left + right) / 2;
                        if (num[among] == n)
                                return among;
                        else if (n < num[among])
                                right = among - 1;
                        else
                                left = among + 1;
                }
                return -1;
        }

        // 递归二分查找
        private static int Dichotomybydigui(int[] num, int left, int right,
                        int keyNum) {
                int among = (left + right) / 2;
                if (left <= right) {
                        if (num[among] == keyNum)
                                return among;
                        else if (keyNum < num[among])
                                //使用递归算法自身调用自身
                                return Dichotomybydigui(num, left, among - 1, keyNum);
                        else
                                return Dichotomybydigui(num, among + 1, right, keyNum);
                }
                return -1;
        }

}


0 0
原创粉丝点击