6-10 二分查找 (20 分)
本题要求实现二分查找算法。
函数接口定义:
1
| Position BinarySearch( List L, ElementType X );
|
其中List
结构定义如下:
1 2 3 4 5 6
| typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; };
|
L
是用户传入的一个线性表,其中ElementType
元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch
要查找X
在Data
中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound
。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #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(); 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:
输出样例1:
输入样例2:
输出样例2:
鸣谢宁波大学 Eyre-lemon-郎俊杰 同学修正原题!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #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(); 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; }
List ReadInput(){ List PtrL; int N; scanf("%d", &N); for(int i = 1; i <= N; i++){ scanf("%d",&PtrL->Data[i]); } PtrL->Last = N; return PtrL; } Position BinarySearch( List L, ElementType X ){ int Left = 1, Right = L->Last, mid; while(Right - Left >= 0 ){ mid = (Left + Right) / 2; if(L->Data[mid] > X){ Right = mid - 1; }else if(L->Data[mid] == X){ return mid; }else{ Left = mid + 1; } } return NotFound; }
|