二分查找又称折半查找,只适用于已经排序好的顺序表。
结构体的定义
typedef struct
{//查找表的数据结构
int data[maxsize];//静态数组
int TableLen;//表长
}SSTable;
定义一个顺序数组和表长数据
初始化表
int InitTable(SSTable& L, int i) //顺序输入i
{
int j;
L.TableLen = 0;
for (j = 0; j < i; j++)
{
L.data[j] = 2 * j + 1;
L.TableLen++;
printf("%d ", L.data[j]);
}
printf("\n表长:%d", L.TableLen);
return 1;
}
顺序输入值2*i+1
二分查找
int TableSearch(SSTable L,int key)
{
int low = 0, high = L.TableLen - 1,mid=0;//定义两个指针,分别指向表头表尾
while (high >= low)
{
mid = (low + high) / 2;
if (key == L.data[mid])
{
printf("找到了在数组下标%d的位置上\n", mid);
break;
}
else if (key > L.data[mid])
low = mid + 1;
else
high = mid - 1;
}
if (low > high)printf("查找失败");
return -1;
}
首先将要查找的值传入,然后定义一个头指针和尾指针分别指向队头和队尾。当high>=low,使mid的high与low的和除2向下取整,判断若key正好等于数组中下标为mid的元素则查找成功。若key大于当前的数据则将mid+1赋值给low,若key小于当前数据则将mid-1赋值给high,再次判断high是否>=low,若满足则继续寻找。若high<low,则退出循环说明寻找失败。
全部代码
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
//二分查找(只适用于排序好的表)
typedef struct
{//查找表的数据结构
int data[maxsize];//静态数组
int TableLen;//表长
}SSTable;
//初始化
int InitTable(SSTable& L, int i) //顺序输入i
{
int j;
L.TableLen = 0;
for (j = 0; j < i; j++)
{
L.data[j] = 2 * j + 1;
L.TableLen++;
printf("%d ", L.data[j]);
}
printf("\n表长:%d", L.TableLen);
return 1;
}
//二分查找
int TableSearch(SSTable L,int key)
{
int low = 0, high = L.TableLen - 1,mid=0;//定义两个指针,分别指向表头表尾
while (high >= low)
{
mid = (low + high) / 2;
if (key == L.data[mid])
{
printf("找到了在数组下标%d的位置上\n", mid);
break;
}
else if (key > L.data[mid])
low = mid + 1;
else
high = mid - 1;
}
if (low > high)printf("查找失败");
return -1;
}
int main()
{
SSTable L;
int i=10, e;
printf("输入的结果是:");
InitTable(L, i);
printf("请输入:");
scanf("%d", &e);
TableSearch(L, e);
return 1;
}