Linux C 使用二分法查找指定值在数组中最邻近值的索引

最近需要实现在一个递增或递减数组中查找与指定的数值最临近的数值的功能,记录一下。
大致意思有一个数组array = [0,1,2,3],那我现在有一个数值是1.6,那么1.6与数组中的2最为接近,则返回索引为2。

例示代码如下:

#include <stdio.h>
#include <math.h>

#define ARRAY_NUM          8          /* 数组成员个数 */ 

static int array[ARRAY_NUM] = {-4, 1, 4, 12, 45, 67, 98, 100};

/*******************************************************************
** 函数名:     get_near_index
** 函数描述:   获取指定数值在数组中最临近的值的索引
** 参数:      value:需要查找
** 返回:      最临近值的索引
********************************************************************/
static int get_near_index(float value)
{
	int ret_index;                        /* 结果索引 */
	int mid_index;                        /* 中位游标 */
	int left_index;                       /* 左位游标 */
	int right_index;                      /* 右位游标 */
	float left_abs;                       /* 左位的值与目标值之间的差的绝对值 */
	float right_abs;                      /* 右位的值与目标值之间的差的绝对值 */

	ret_index = 0;
	left_index = 0;
	right_index = ARRAY_NUM - 1;	
	mid_index = 0;
	left_abs = 0;
	right_abs = 0;
	
	while(left_index != right_index){
		mid_index = (right_index + left_index) / 2;
		if (value <= array[mid_index]) {
			right_index = mid_index;
		} else {
			left_index = mid_index;
		}
		if (right_index - left_index < 2) {
			break;
		}
	}

	left_abs = fabs(array[left_index] - value);
	right_abs = fabs(array[right_index] - value);
	ret_index = right_abs <= left_abs ? right_index : left_index;
	
	return ret_index;
}

int main()
{
	float v;

	v = -5.5;
	printf("1-------- value = %f, index = %d\n", v, get_near_index(v));

	v = 2.4;
	printf("2-------- value = %f, index = %d\n", v, get_near_index(v));

	v = 2.5;
	printf("3-------- value = %f, index = %d\n", v, get_near_index(v));

	v = 2.6;
	printf("4-------- value = %f, index = %d\n", v, get_near_index(v));

	v = 8.0;
	printf("5-------- value = %f, index = %d\n", v, get_near_index(v));

	v = 15.0;
	printf("6-------- value = %f, index = %d\n", v, get_near_index(v));

	v = 98.5;
	printf("7-------- value = %f, index = %d\n", v, get_near_index(v));
	return 0;
}
发布了62 篇原创文章 · 获赞 106 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/lang523493505/article/details/81709968