题目
题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出
对于每组输入,请输出结果。
样例输入
4
1 2 3 4
3
样例输出
2
思路
将所有数字排序后,用二分法找到指定的数字。
注意:输入数据时需要保存数字原来的下标。
代码
#include <stdio.h>
#include <stdlib.h>
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;
}