场景描述:给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置。
首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明待查找的数据不在数据序列中
顺序查找说明:
优点:实现简单,直接一个一个遍历判断即可
缺点:当数据是有序,并且数据不在数据序列中时,会查询N次才能确定数据不在数据序列中,查询次数较高,效率低。
针对有序的数据序列,可以从中间开始进行比较,因为是有序的,若中间值比目标值小,则目标值一定在前半部分序列或者不在序列中,然后依次进行比较。
这种查询方式就是数据结构中的二分查找,使用java语言实现(使用二分查找的前提条件:数据序列是有序的,否则不能使用此种方式)
列举实例: a[]= {18,21,23,34,56,65,78,88,90,92}; 需要查询数据65是否在数据序列中?
使用顺序查找时:需要比较6次才能确定65在数据序列中
使用二分查找时:首先使用数据的中间值(low+high)/2得到 56,然后与65进行比较,56<65,所以数据一定在56的后面序列中;
然后再65到92中使用此种方式进行比较,{65,78,88,90,92},次数据序列中的中间值是88,88>65,所以数据一定是在65到88之间;
{65,78}同上方式所示,中间值是65,使用65与65比较,65==65,所以查找到65,一共比较3次,56,88,65;比较次数少于顺序比较,效率更高。
具体代码实现如下所示:
package com.three.fourteen; public class QuickSort { /** * 使用二分查找 * @param args */ public int findData(int a[],int tar) { int low=0; int high=a.length-1; int mid; while(low<=high) { mid=(low+high)/2;
System.out.println("和 "+a[mid]+" 进行比较"); if(low<high&&a[mid]==tar) return mid; else if(low<high&&a[mid]>tar) high=mid-1; else low=mid+1; } return -1; } public static void main(String[] args) { int a[]= {18,21,23,34,56,65,78,88,90,92}; int tar=65; QuickSort qs=new QuickSort(); int x=qs.findData(a, tar); if(x!=-1) { System.out.println("找到目标数据 65,在数据序列中的第 :"+(x+1) +" 个位置"); }else { System.out.println("没有找到目标数据 65"); } } }
运行结果: