二分查找:
题目:从线性结构列表【12,31,55,89,101,5】中查找出输入的X数值在列表中的下标(注意:此处第一个元素的下标为1)
评分结果:
Submit Time | Status | Score | Problem | Compiler | Run Time | User |
---|---|---|---|---|---|---|
4/1/2019, 22:54:47 | Accepted | 20 | 01-复杂度3 | C (gcc) | 22 ms | BrianLi |
Case | Hint | Result | Run Time | Memory |
---|---|---|---|---|
0 | sample1 等价 | Accepted | 3 ms | 384 KB |
1 | sample2 等价,但NotFound重新定义 | Accepted | 1 ms | 256 KB |
2 | 奇数个,正中间找到,MAXSIZE重新定义 | Accepted | 2 ms | 256 KB |
3 | 偶数个,正中间找到 | Accepted | 2 ms | 256 KB |
4 | 大数据,在头部找到 | Accepted | 22 ms | 640 KB |
5 | 大数据,在尾部找到 | Accepted | 22 ms | 512 KB |
6 | 大数据,找不到 | Accepted | 22 ms | 680 KB |
代码实现:
#include<iostream>
using namespace std;
#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
Position BinarySearch( List L, ElementType X );
int main()
{
List L;
ElementType X;
Position P;
LNode LNode1;
L = &LNode1;
//定义线性结构表内容,默认将第一个元素的下标设为1
L->Data[1] = 12;
L->Data[2] = 31;
L->Data[3] = 55;
L->Data[4] = 89;
L->Data[5] = 101;
L->Last = 5;
//输入查找数字X,有则返回下标,无则返回iui0
scanf("%d", &X);
P = BinarySearch( L, X );
printf("%d\n", P);
}
//二分查找算法
Position BinarySearch( List L, ElementType X )
{
Position P=0;
int left;
int right;
int middle;
left = 0;
right = L->Last;
middle = (left + right)/2;
while(left <= right)
{
if(L->Data[middle] > X)
{
right = middle-1;
}
else if(L->Data[middle] < X)
{
left = middle+1;
}
else if(L->Data[middle] == X)
{
P = middle;
break;
}
middle = (left + right)/2;
}
if(L->Data[middle] == X)
P = middle;
else
P = NotFound;
return P;
}