二分法查找有序表中最接近的数值

本文介绍了一种高效的查找方法——二分查找(Binary Search),详细解释了其工作原理及适用条件。并通过一个具体的C语言实现案例展示了如何寻找有序数组中与目标值最接近的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找(Binary Search):

     二分查找又称折半查找,它是一种效率较高的查找方法。

     二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。

实例:二分法查找有序表中最接近的数值

/**
 * 二分法查找递增表中最接近的数
 * @return
 * - 数组下标 成功
 * - -1 失败
 */
int txpb_binarey_search_ex(unsigned long long *pstArray, int iLength, unsigned long long ullTime)
{    
    int middle = 0;    
    int low = 0, high = iLength - 1;    
    if(!pstArray  || iLength < 1)    
    {       
        printf("%s %d error !\n", __func__, __LINE__);        
        return -1;    
    }
    
    if(iLength == 1)    
    {        
        return iLength - 1;   
    }
    
    if(ullTime <= pstArray[0]) 
    {    
        return 0;
    }   
    else if(ullTime >= pstArray[iLength - 1])  
    {      
        return iLength - 1;  
    }
    
    while(low <= high) 
    {            
        middle = (low + high)/2;  
        if(abs(pstArray[middle+1] - ullTime) > abs(pstArray[middle] - ullTime)) 
        {        
            high = middle - 1;    
        }      
        else  
        {         
            low = middle + 1;    
        }         
    }          
    return (abs(pstArray[middle+1] - ullTime) > abs(pstArray[middle] - ullTime)) ? middle : (middle+1);
}

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
	int i;
	unsigned long long pstArray[] = {2,5,7,20,32,89,120,123, 500};
	unsigned long long val = 33;
	int len = sizeof(pstArray)/sizeof(unsigned long long);

	for(i = 0; i < len; i++)
	{
			printf("pstArray[%d]=%llu \n", i, pstArray[i]);
	}

	i = txpb_binarey_search(pstArray, len, val);

	printf(">>> Find index of '%llu' : %d \n", val, i);

	return 0;
}

测试结果:

pstArray[0]=2
pstArray[1]=5
pstArray[2]=7
pstArray[3]=20
pstArray[4]=32
pstArray[5]=89
pstArray[6]=120
pstArray[7]=123
pstArray[8]=500
>>> Find index of '33' : 4



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值