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

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

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

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

用一张图来描述一下
因为是折半查找,比顺序查找查找速度快,如果你找的数不在这个0-mid之间就淘汰一般半数据,去找下一个mid继续寻找在这里插入图片描述
代码实现(C语言版):

#include <stdio.h>
#include <stdlib.h>
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 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);
        }
    }
}
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值