您的位置:首页 > 其它

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

2016-05-24 15:28 357 查看

二分查找(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: