折半查找法(基于有序数组)

折半查找又叫做二分查找,就是在查找的过程中,每次查找先找一个左值和一个右值,中间值=左值+右值/2,如果中间值比目标值大,那么右值就等于中间值-1,如果中间值比目标值小,左值就等于中间值+1,所以每次都会淘汰掉一半的数据,效率比较高,但它必须是基于有序数组的
折半查找的方法优点:

  • 比较次数少
  • 查找速度快
  • 平均性能好
  • 要求待查表为有序表
  • 存储结构一定是顺序结构

步骤:
(1) 找到最左边的值left和最右边的值right,中间值(mid)=left+right/2,
(2) 将目标值num与中间值(mid)比较,如果mid>num,right=mid-1,如mid (3) 重复以上步骤,当left=mid或者right=mid的时候就找到了,返回下标
(4) 当right

用一张图来描述一下
因为是折半查找,比顺序查找查找速度快,如果你找的数不在这个0-mid之间就淘汰一般半数据,去找下一个mid继续寻找折半查找法(基于有序数组)_第1张图片
代码实现(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);
        }
    }
}

你可能感兴趣的:(编程)