摘自:https://blog.csdn.net/maoyuanming0806/article/details/78176957
二分查找是一种查询效率非常高的查找算法。又称折半查找。
起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法
二分查找算法思想
有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。
一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找图示说明
二分查找优缺点
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
使用条件:查找序列是顺序结构,有序。
一下为两种实现方法:
import java.util.Scanner; public class Main{ // public static int [] a = new int[20]; public static void main(String[] args){ Scanner cin = new Scanner(System.in); int a[] = {1,3,5,7,9,11,22}; int len = 5; int w = erfen(a, 0, 5, 6); int w2 = erfen2(a, 0, 5, 6); System.out.println(w); System.out.println(w2); } // 二分查找:递归版 public static int erfen(int[] a, int left, int right, int key) { int mid = left + (right - left) / 2; // 这样可以避免 (left + right)益出现象 if(key < a[left] || key > a[right] || left > right){ return -1; } // System.out.println(a[mid]); if(a[mid] == key) { return mid; } else if(a[mid] > key){ return erfen(a, left, mid - 1, key); } else { return erfen(a, mid + 1, right, key); } } // 用循环做二分查找 public static int erfen2(int[] a, int left, int right, int key) { int mid; while(left <= right) { mid = left + (right - left) / 2; if(key == a[mid]) { return mid; } else if(key < a[mid]) { right = mid - 1; } else { left = mid + 1; } } return -1; } } /* */