折半查找又叫做二分查找,就是在查找的过程中,每次查找先找一个左值和一个右值,中间值=左值+右值/2,如果中间值比目标值大,那么右值就等于中间值-1,如果中间值比目标值小,左值就等于中间值+1,所以每次都会淘汰掉一半的数据,效率比较高,但它必须是基于有序数组的
折半查找的方法优点:
步骤:
(1) 找到最左边的值left和最右边的值right,中间值(mid)=left+right/2,
(2) 将目标值num与中间值(mid)比较,如果mid>num,right=mid-1,如mid
(4) 当right
用一张图来描述一下
因为是折半查找,比顺序查找查找速度快,如果你找的数不在这个0-mid之间就淘汰一般半数据,去找下一个mid继续寻找
代码实现(C语言版):
#include
#include
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int to_find = 4; //要找的元素是4
int left = 0; //左边从下标位0处开始
int right = sizeof(arr) / sizeof(arr[0] ) - 1; //右边是数组长度除以第一个元素-1
int mid = 0;
while (left <= right) //right最后一个元素的下标写成<=是因为[left,right]是闭区间,如果写成<的话会导致当left=right时,是闭区间,如果写成<的话就会导致当left=right时,//循环走不进去,也就失去了一次比较的机会
{
mid = (left + right) / 2;
if (to_find < arr[mid]) //如果要找的数比mid小,那就往前面找,right=mid-1,往前移了一半元素
{
right = mid - 1; //刨除mid这样的临界值
}
else if (to_find>arr[mid]) //如果找的数比mid大,就往后找,left=mid+1
{
left = mid + 1;
}
else //to_find=arr[mid],找到了,就break
{
break;
}
}
if (left <= right) //找到了
{
printf("找到了!下标为%d\n", mid);
}
else
{
printf("没找到!\n");
}
system("pause");
return 0;
}
//上面的while循环退出的可能有两种:
//1.while里面left<=right条件不满足
//2.找到了元素就break了
Java版:
package com.bittech;
/**
* Author:weiwei
* description:二分查找
* Creat:2019/3/30
**/
public class TestBinarySearch {
public static int binarySearch(int num,int[] array){
int left = 0; //代表第一个元素,下标从0开始
int right = array.length -1;
while(left <= right){
int mid = left+(right-left)/2;
if(array[mid]num){
left = mid -1;
}
else{
return mid;
}
}
return -1;
}
public static void main(String[] args) {
int[] array={5,1,6,3,7,9};
int num = 3;
int position=binarySearch(num,array);
if(position == -1){
System.out.println("没找到,序列中没有该数!");
}else{
System.out.println("找到了!"+"下标是:"+num);
}
}
}