二分查找算法
编写程序构造一个有序表PL,从键盘接收一个关键字key,分别用线性查找法和二分查找法(递归实现和非递归实现)在PL中查找key,并输出具体的查找过程。若找到则提示查找成功并输出key所在的位置,否则提示没有找到。
注意: 1.n个元素有序表可以直接定义[0:n-1];(n>=60)
2.必须在写清楚二分查找法的算法思想(自己组织语言描述)
3.二分查找法必须实现迭代和递归两个版本.
4.必须输出中间过程;
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define LEN 100
typedef struct
{
int data[MAXSIZE]; //存在范围0~MAXSIZE-1
int length; //长度
}SeqList;
void init(SeqList *L,int n)
{
L->length=n;
for(int i=0;i<L->length;i++)
{
L->data[i]=5*i+rand()%5;
}
}
void print(SeqList *L)
{
for(int i=0;i<L->length;i++)
{
printf("%4d ",L->data[i]);
}
printf("\n");
}
/********************1.线性查找法算法思想描述***********************/
//按顺序逐个寻找
//如果在序列中找到与查找元素相等的元素
//结束程序
//线性查找法的迭代版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素
int LinearSerach(SeqList *L,int key)
{
int i,j;
printf("\nLinearSerach\n");
for(i = 0; i < L->length; i++)
{
if(L->data[i] == key)
{
return i+1;
}
}
if(i == L->length)
{
return -1;
}
}
/********************2.二分查找法算法思想描述***********************/
//先找到序列的中间元素
//把中间元素与查找元素比较大小。当该序列为空时,查无此元素,结束寻找;两者相等时找到查找元素,终止寻找。
//中间元素大于查找元素时,把序列左边子序列重复上面查找
//中间元素小于查找元素时,把序列右边子序列重复上面查找
//二分查找法的迭代版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素
int BinarySerach1(SeqList *L,int key)
{
int i,j,k,mid,low,high;
low = 0;
high = L->length;
mid = (low + high) / 2 ;
print(L);
printf(" 位置是:第%d个\n",mid + 1);
while(low <= high && L->data[mid] != key )
{
if(L->data[mid] > key)
{
high = mid - 1;
mid = (low + high) / 2;
}
else if(L->data[mid] < key)
{
low = mid + 1;
mid = (low + high) / 2;
}
print(L);
printf(" 位置是:第%d个\n",mid + 1);
}
if(low > high)
{
return -1;
}
if(L->data[mid] == key)
{
return mid+1;
}
}
//二分查找法的递归版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素,
//low为本次查找范围的下限,high为本次查找范围的上限
int BinarySerach2(SeqList *L,int key,int low,int high)
{
int mid;
mid = (low + high) / 2;
print(L);
printf(" 位置是:第%d个\n",mid + 1);
if(low > high)
{
return -1;
}
if(L->data[mid] == key)
{
return mid+1;
}
else if(L->data[mid] > key)
{
return BinarySerach2(L, key, low, mid - 1);
}
else if(L->data[mid] < key)
{
return BinarySerach2(L, key, mid + 1, high);
}
}
int main()
{
SeqList L;
int key;
int a;
init(&L,LEN);
print(&L);
printf("请输入你要查找的数字:\n");
scanf("%d",&key);
a = LinearSerach(&L,key);
if(a == -1)
{
printf("查无此数!\n");
}
else
{
printf("该元素的位置是:第%d个\n",a);
}
printf("\nBinarySerach迭代\n");
a = BinarySerach1(&L,key);
if(a == -1)
{
printf("查无此数!\n");
}
else
{
printf("该元素的位置是:第%d个\n",a);
}
printf("\nBinarySerach递归\n");
a = BinarySerach2(&L,key,0,L.length);
if(a == -1)
{
printf("查无此数!\n");
}
else
{
printf("该元素的位置是:第%d个\n",a);
}
return 0;
}