二分法查询相关总结

二分法查询相关总结


说明:

二分查找又称折半查找,它是一种效率较高的查找方法。

折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。 折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。


优缺点:
折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。


时间复杂度:

二分循环遍历数组时,

假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到二分到1结束(最坏情况),

那么我们设置次数为Y,则表达式:
  N*(1/2)^Y=1;

经过推算:

可得 Y = Log2N (log以2为底的N)


代码实现:

一个递归实现,一个循环实现:

public class Test { 
        /** 
        * 二分查找算法 
        * 
        * @param array 有序数组 
        * @param key 查找元素 
        */  
        public static void main(String[] args) { 
            int array[] = {2,3,5,7,11,13,19,23,29,31,32,55,66,70,81,95,110};  
            System.out.println("递归法:");
            binSearch(array, 0, array.length - 1,81);  
            System.out.println("================================");
            System.out.println("循环法:");
            binSearch(array,5);
        } 

        // 二分查找递归实现   
        public static void binSearch(int array[], int start, int end, int key) { 
            int mid = (end - start) / 2 + start;
            if (array[mid] == key) { 
            	System.out.println("key对应数组的索引位置:" + mid);
            } else if (key > array[mid]) {   
            	System.out.println("向右查找!");
            	if(mid+1 >= array.length) {
            		System.out.println("key在数组中不存在!");
            	}else {
            		binSearch(array, mid + 1, end, key);  
            	}
            } else if (key < array[mid]) {   
            	System.out.println("向左查找!"); 
            	if(mid-1 < 0) {
            		System.out.println("key在数组中不存在!");
            	}else {
            		binSearch(array, start, mid - 1, key);   
            	} 
            }     
        } 

        // 二分查找普通循环实现   
        public static void binSearch(int array[], int key) {   
            int mid = array.length / 2;   
            if (key == array[mid]) {   
            	System.out.println("key对应数组的位置:" + mid); 
            }   
            int start = 0;   
            int end = array.length - 1;   
            while (start <= end) {   
                mid = (end - start) / 2 + start;   
                if (key < array[mid]) {   
                    System.out.println("向左查找!"); 
                    end = mid - 1;   
                } else if (key > array[mid]) {   
                	System.out.println("向右查找!"); 
                    start = mid + 1;   
                } else {   
                	System.out.println("key对应数组的索引位置:" + mid);
                	break;
                }   
            }
            if(start > end){
            	System.out.println("key在数组中不存在!"); 
            }    
        } 
    }

おすすめ

転載: blog.csdn.net/weixin_44958006/article/details/121268298