二分搜索算法源程序
C语言实现 二分查找算法
1.1
/*二分算法*/
#include
#define N 100
int Found(int a[],int x,int y)
{
int h,r,m;
h=0;r=y-1;m=(h+r)/2;
while(h<=r&&x!=a[m])
if(x
else {h=m+1;m=(h+r)/2;}
if(h>r) return -1; /*查找失败,返回-1*/
return m; /*查找成功,返回有效下标m */
} // Search_Bin
void main()
{
int m,a[N],i,x,n;
printf("请输入m=:\n");
scanf("%d",&m);
printf(" 请按从小到大的顺序输入一组数:\n");
for(i=0;i
scanf("%d",&a[i]);
printf("请输入要查找的数:\n");
scanf("%d",&x);
n=Found(a,x,m);
if(n==-1)
printf("查找失败");
else
printf("\n位置是%d\n",n);
}
1.2
#include
#include
typedef int DATATYPE; /*假定顺序表元素的类型为整型*/
#define maxsize 1024 /*假定顺序表的最大长度为1024*/
typedef struct
{
DATATYPE data[maxsize]; /*顺序表元素数组,第一个结点是data[0] */
int len; /*线性表中实际存放的数据个数*/
} SEQLIST;
/*****************************************************************************/
void ListInit (SEQLIST *L)
//将表L清空(初始化)
{
L->len=0;
}
/*****************************************************************************/
int ListLength(SEQLIST L)
//返回线性表L的元素个数
{
return(L.len);
}
int ListInsert(SEQLIST *L, int i, DATATYPE x)
//在顺序表L的第i个位置插入元素x,成功:1,失败:0
{
int j;
if ((L->len)>=maxsize)
{
printf("overflow\n");
return 0;
} //溢出
else
if((i<1)||(i>L->len+1))
{
printf("error\n");
return 0;
} //非法位置
else
{
for(j=L->len-1;j>=i-1;j--)
L->data[j+1]=L->data[j];//结点后移
L->data[i-1]=x;//插入x
L->len=L->len+1;//表长加1
return(1); //成功
}
}
void Listinput(SEQLIST *L,DATATYPE x)
{
int i,n;
printf("请输入要输入的数据个数:");
scanf("%d",&n);
for(i=0;i
{
printf("请输入第%d个数据:",i+1);
scanf("%d",&(L->data[i]));
L->len++;
}
printf("输入成功!!");
}
int Listsearch(SEQLIST *L,DATATYPE K)
{ int low=0,mid,high=L->len-1;
while (low<=high)
{ mid=(low+high)/2; //整除
if (K==L->data[mid])
return mid;
if (Kdata[mid])
high=mid-1;
else low=mid+1;
}
return -1; //查找失败
}
main()
{
SEQLIST list;
int i,xuanze,p;
DATATYPE x;
char flag='Y';
ListInit (&list);
while(1)
{
printf(" 1、创建顺序表数组 \n");
printf(" 2、查找数据 \n");
printf(" 0、退出 \n");
printf("\n");
printf("请选择:");
scanf("%d",&xuanze);
switch(xuanze)
{
case 1:
{
Listinpu