题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出
对于每组输入,请输出结果。
样例输入
4
1 2 3 4
3
样例输出
2
本地调试看不出毛病,求大神帮看看
#include <iostream>
#include <algorithm>
using std::cin;
using std::cout;
using std::endl;
using std::sort;
const int MaxSize = 210;
int a[MaxSize];
int main(){
int n,x,k;
while(cin >> n){
for( int i = 0 ; i < n ; i++ ){
cin >> a[i];
}
sort( a , a + n );
cin >> x;
k = n / 2;
for( int i = 0 ; i <= n ; k = ( i + n ) / 2 ){
if( a[k] == x ){
cout << k;
break;
}
if( a[k] < x )
i = k + 1;
else if( a[k] > x )
n = k - 1;
}
if(a[k] != x)
cout << -1;
cout << endl;
}
return 0;
}
折半查找是不行的,折半查找有一个前提那就是:数组的数必须有序,不然效率低的可怜。下面我写的,比较简单,什么也没做处理,你要的功能基本实现,根据这个改下吧
#include
using namespace std;
int main() {
int n = 0;
cin >> n;
int* ptr = new(nothrow) int[n];
for (auto i = 0; i < n; i++) {
cin >> ptr[i];
}
int x = 0;
cin >> x;
auto j = 0;
auto status = 0;
for (; j < n; ++j) {
if (ptr[j] == x) {
status = 1;
break;
}
}
if (status == 0) {
j = -1;
}
cout << j << endl;
delete[] ptr;
cin.get();
cin.get();
return 0;
}
我也要二分查找了,感觉自己写的没错啊 ,但是测试错了50%
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX = 201;
bool cmp(int a, int b){
return a < b;
}
int binarySearch(int a[], int x, int n){
sort(a, a + n, cmp);
int left = 0;
int right = n - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(a[mid] == x)return mid;
else if(a[mid] > x)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
int main(){
int a[MAX];
int n;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
int x;
scanf("%d", &x);
printf("%d\n", binarySearch(a, x, n));
}
}