算法笔记练习 4.5 二分 问题 A: 找x

算法笔记练习 题解合集

题目链接

题目

题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

输出
对于每组输入,请输出结果。

样例输入

4
1 2 3 4
3

样例输出

2

思路

将所有数字排序后,用二分法找到指定的数字。
注意:输入数据时需要保存数字原来的下标。

代码

#include 
#include 
typedef struct{
	int value;	// 数值 
	int index;	// 原始下标 
} Num;

// qsort 排序函数
int cmpNum(const void *a, const void *b){
	return (*(Num*)a).value > (*(Num*)b).value;
}

// 在长度为 n 的数组 a 中寻找 x
// 若查找成功返回下标,失败返回 -1 
int binarySearch(int n, Num *a, int x){
	int ret = -1;
	int left = 0;
	int right = n - 1;
	int middle;
	while (left <= right){
		middle = left + (right - left) / 2;
		if(a[middle].value == x){
			ret = middle;
			break;
		} else if (a[middle].value > x){
			right = middle - 1;
		} else {
			left = middle + 1;
		} 
	} 
	return ret; 
} 

int main(){
	int n, x, i;
	while (scanf("%d", &n) != EOF){
		Num nums[n];
		for (i = 0; i < n; ++i){
			scanf("%d", &nums[i].value);
			nums[i].index = i; 
		}
		scanf("%d", &x);
		 
		qsort(nums, n, sizeof(Num), cmpNum);
		
		int ans = binarySearch(n, nums, x);
		if (ans == -1)
			printf("-1\n");
		else 
			printf("%d\n", nums[ans].index); 
	} 
	return 0;
} 

你可能感兴趣的:(算法笔记)