JAVA实现二分查找

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

前提

给定一已排好序的n个元素a[0 : n-1],现要在这n个元素中找出一特定元素x。

算法 思想

首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大 于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

 

 1 public class BinarySearch {
 2 
 3     /***
 4      * 
 5      * @param a 已排好序的数组
 6      * @param dst 需要查找的目标值
 7      * @return 查找到目标值返回目标值在数组中的位置,没有超重到目标值返回-1
 8      */
 9     public int binarySearch(int[] a, int dst) {
10         
11         int flag = 0;
12         //先判断数组是顺序还是倒序
13         if (a[0] > a[a.length - 1]) {
14             System.out.println("array is reverse order");
15             flag = 1;  //数组为倒序
16         }
17         
18         int mid = -1;
19         int low = 0;
20         int high = a.length - 1;
21         if (0 == flag) {
22             while (low <= high) {
23                 mid = low + (high-low)/2; //此处不用(low + high)/2是防止low + high值溢出
24                 if (a[mid] == dst) {
25                     printSearchResult(a,dst,mid);
26                     return mid;
27                 } else if (dst < a[mid]) {
28                     high = mid - 1;
29                 } else {
30                     low = mid + 1;
31                 }
32             }
33         } else {
34             while (low <= high) {
35                 mid = low + (high-low)/2; //此处不用(low + high)/2是防止low + high值溢出
36                 if (a[mid] == dst) {
37                     printSearchResult(a,dst,mid);
38                     return mid;
39                 } else if (dst < a[mid]) {
40                     low = mid + 1;
41                 } else {
42                     high = mid - 1;
43                 }
44             }
45         }
46         
47         
48         System.out.println("not find the num " + dst + " in the array");
49         return -1;
50         
51     }
52     
53     /***
54      * 打印查找结果
55      * @param a 数组
56      * @param dst 查找的目标值
57      * @param position 目标值在数组中的位置
58      */
59     private void printSearchResult(int[] a,int dst, int position) {
60         String tmp = "find the num " + dst + " in the array {";
61         for (int i = 0; i < a.length - 2; i++) {
62             tmp += a[i] + ",";
63         }
64         tmp += a[a.length - 1] + "}, position is " + position;
65         System.out.println(tmp);
66     }
67     
68     public static void main(String[] args) {
69         int a[] = {1,3,5,7,8,9,10,12,15,17};
70         BinarySearch binarySearch = new BinarySearch();
71         binarySearch.binarySearch(a,17);
72         binarySearch.binarySearch(a, 8);
73         int b[] = {17,13,11,9,7,6,4,2,1};
74         binarySearch.binarySearch(b,17);
75         binarySearch.binarySearch(b, 4);
76         binarySearch.binarySearch(b, 1);
77     }
78     
79 }

 

 

 1 public class BinarySearch {
 2     public static void main(String[] args) {
 3         int[] arys = {1, 3, 6, 11, 35, 36, 45, 66, 75};
 4         System.out.println(binarySearch(arys, 6, 0, arys.length - 1));
 5     }
 6 
 7     private static int binarySearch(int[] arys, int element, int begin, int end) {
 8         // TODO Auto-generated method stub
 9         if (begin <= end) {
10             int mid = (begin + end) >> 1;
11             if (arys[mid] == element)
12                 return mid;
13             else if(arys[mid] > element) {
14                 return binarySearch(arys, element, 0, mid - 1);
15             } else {
16                 return binarySearch(arys, element, mid + 1, end);
17             }
18         } else
19         return -1;
20     }
21 }

 

posted @ 2013-09-22 14:57  曾先森在努力  阅读(262)  评论(0编辑  收藏  举报