二分查找算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.、
一下是java开发示例
package twoG; /** * 二分算法 : 优点-->比较次数少,查找速度快,平均性能好。 缺点-->要求待查表为有序表,且插入删除困难。 * 适用于不经常变动而查找频繁的有序列表 * * 二分查找的基本思想是将n个元素分成大致相等的俩个部分,去a[n/2]与x作比较,如果x=a[n/2],算法终止, * 如果x<a[n/2],则要在x的左半部分搜索x,如果x>a[n/2],则要在x的右半部分搜索x * @author DELL * */ public class BinarySearch { private int rCount = 0; private int lCount = 0; /** * 获取递归的次数 */ public int getrCount(){ return rCount; } /** * 获取循环次数 * */ public int getlCount(){ return lCount; } /** * 执行递归二分算法,返回第一次出现该值的位置 * sortedDate 已经排序的数组 * start 开始位置 * end 结束位置 * findValue 需要找的值 * return 在数组中的位置,从0开始,找不到返回-1 * * */ public int searchRecursive(int[] sortedData,int start,int end,int findValue) { rCount++; //递归次数 if(start<=end) { //中间位置 int middle=(start+end)>>1; //相当于(start+end)/2 //中值 int middleValue=sortedData[middle]; if(findValue==middleValue) { //等于中值直接返回 return middle; } else if(findValue<middleValue) { //小于中值时在中值前面找 return searchRecursive(sortedData,start,middle-1,findValue); } else { //大于中值在中值后面找 return searchRecursive(sortedData,middle+1,end,findValue); } } else { //找不到 return -1; } } /** * 循环二分查找,返回第一次出现该值的位置 * @param sortedData 已排序的数组 * @param findValue 需要找的值 * @return 值在数组中的位置,从0开始。找不到返回-1 */ public int searchLoop(int[] sortedData,int findValue) { int start=0; int end=sortedData.length-1; while(start<=end) { lCount++; //循环次数 //中间位置 int middle=(start+end)>>1; //相当于(start+end)/2 //中值 int middleValue=sortedData[middle]; if(findValue==middleValue) { //等于中值直接返回 return middle; } else if(findValue<middleValue) { //小于中值时在中值前面找 end=middle-1; } else { //大于中值在中值后面找 start=middle+1; } } //找不到 return -1; } }
package twoG; public class BinarySearchTest { public void testSearch() { BinarySearch bs=new BinarySearch(); int[] sortedData={1,2,3,4,5,6,6,7,8,8,9,10}; int findValue=9; int length=sortedData.length; /** * 递归二分算法 */ int pos=bs.searchRecursive(sortedData, 0, length-1, findValue); System.out.println("Recursice:"+findValue+" found in pos "+pos+";count:"+bs.getrCount()); /** * 循环二分查找 */ int pos2=bs.searchLoop(sortedData, findValue); System.out.println("Loop:"+findValue+" found in pos "+pos+";count:"+bs.getlCount()); } public static void main(String[] args){ BinarySearchTest t = new BinarySearchTest(); t.testSearch(); } }