对于已经排好序的数组,可以用二分法进行查找,其时间复杂度要比遍历快,O(log N)。二分查找算法主要注意边界问题,就很容易实现。其思想就是首先判断查找的数X是大于中间的数还是小于,若大于则查找右边,同时将中间下标加1作为左边界;否则查找左边,同时将中间下标减1作为右边界。依次反复查找,直到找到;左右边界相等则说明查找结束,没找到。
迭代法:
分析起来较复杂,但不会增加内存空间,下面是我写的线性表二分查找——迭代实现源程序:
#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();
while(scanf("%d", &X)!=EOF)
{
P = BinarySearch( L, X );
printf("%d\n", P);
}
return 0;
}
List ReadInput()
{
List L;
int i;
L = (List