问题来自与一道练习题,属于程序填空,需要根据已有条件进行补充,具体说明如下:
函数接口定义:
Position BinarySearch( List L, ElementType X );
其中List
结构定义如下:
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
L
是用户传入的一个线性表,其中ElementType
元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch
要查找X
在Data
中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound
。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
Position BinarySearch( List L, ElementType X );
int main()
{
List L;
ElementType X;
Position P;
L = ReadInput();
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
12 31 55 89 101
31
输出样例1:
2
输入样例2:
3
26 78 233
31
输出样例2:
0
遇到的问题
按照二分查找的基本逻辑,能找到就一定再mid位置,如果找不到就是其他情况。但是PTA提交遇到这种状况……
Submit Time | Status | Score | Problem | Compiler | Run Time | User |
---|---|---|---|---|---|---|
5/5/2019, 15:21:31 | Partially Accepted | 16 | 01-复杂度3 | C (gcc) | 21 ms | Smartyu |
Case | Hint | Result | Run Time | Memory |
---|---|---|---|---|
0 | sample1 等价 | Accepted | 1 ms | 220 KB |
1 | sample2 等价,但NotFound重新定义 | Wrong Answer | 2 ms | 288 KB |
2 | 奇数个,正中间找到,MAXSIZE重新定义 | Accepted | 1 ms | 288 KB |
3 | 偶数个,正中间找到 | Accepted | 1 ms | 256 KB |
4 | 大数据,在头部找到 | Accepted | 15 ms | 512 KB |
5 | 大数据,在尾部找到 | Accepted | 10 ms | 512 KB |
6 | 大数据,找不到 | Wrong Answer | 21 ms | 512 KB |
就很是问题了,实现的逻辑没有错误,但是不合要求,最后我是通过left == right直接判断返回NotFound了,而问题就出在这里,所以想到的解决方法,不直接return,而是放到最后再return,这里就需要再int一个值来记录位置。
Position BinarySearch(List L, ElementType X)
{
int low, high, mid, pos;
pos = 0;
low = 1;
high = L -> Last;
while (low <= high) {
mid = (low + high) / 2;
if (X == L -> Data[mid]){
pos = mid;
break;
}
else if (X < L -> Data[mid])
high = mid - 1;
else if (X > L -> Data[mid])
low = mid + 1;
}
if (pos == 0)
return NotFound;
return pos;
}
然后,关于ReadInput(),暂时还没有想明白是怎么实现的,先放这里了。。