折半查找

2017-06-07

 关于折半查找

   折半查找算法(二分查找)是一种快速的查找算法。当我们再一个数组中查找是否存在某个数时,通常是直接遍历

这个数组直到找到这个数,时间复杂度为O(n)试想如果数据量很大,上亿呢,怎么办,这里我们可以用

一种简单快速的的查找算法--二分查找算法也叫做折半查找算法。

 

二分查找算法的算法思维:

1.首先查找数组必须是有序的(假设为升序)。

2.取查找数组中间的数作为基准,如果需要查找的数据大于基准说明该数存在于 数组的左边。反之存在于基准右边。

3 假设待查找的数小于基准,那么将基准换成左子数组的中间的数,重复步骤2,直到找到该数。

4.图解:

  

很显然对于上亿规模的数据查找,我们可以将待查找的数据进行排序,然后再用二分查找进行查找。

 

二分查找的时间复杂度为O(logn):

  logn是什么意思呢?意思是当我们在1000个元素中查找某个元素时 只需要10次比较就可以找到该元素。

 

记住二分查找只能针对有序数据,切记这一点。

代码:
1
package service; 2 3 import java.util.Scanner; 4 5 public class index { 6 public static int Max = 20; 7 // 数据数组源 8 public static int data[] = { 12, 16, 19, 22, 25, 32, 39, 39, 48, 55, 57,58,63, 68, 69, 70, 78, 84, 88, 90, 97 }; 9 // 计数器 10 public static int count = 1; 11 public static void main(String[] args) { 12 System.out.println("请输入您要查找的数字:"); 13 Scanner sc = new Scanner(System.in); 14 int KeyValue = sc.nextInt(); 15 // 调用折半查找 16 if (Search(KeyValue)) { 17 // 输出查找次数 18 System.out.println("共查找了" + count + "次"); 19 } else { 20 // 输出没有找到数据 21 System.out.println("抱歉,数据数组源中找不到您输入的数字"); 22 } 23 } 24 25 // 折半查找法 26 public static boolean Search(int k) { 27 int left = 0;// 左边界变量 28 int right = Max - 1;// 右边界变量 29 int middle;// 中位数变量 30 while (left <= right) { 31 middle = (left + right) / 2; 32 if (k < data[middle]) { 33 right = middle - 1;// 查找前半段 34 } else if (k > data[middle]) { 35 left = middle + 1;// 查找后半段 36 } else if (k == data[middle]) { 37 System.out.println("Data[" + middle + "] = " + data[middle]); 38 return true; 39 } 40 count++; 41 } 42 return false; 43 } 44 }
posted @ 2017-06-07 16:04  A小小高  阅读(149)  评论(0)    收藏  举报