折半查找
//折半查找
int Binary_Search(SSTable L,ElemType key)
{
int low=0,high=L.TableLen-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(L.elem[mid]==key)
return mid;
else if(L.elem[mid]>key)
high=mid-1;
else
low=mid+1;
}
return -1;
}
完整代码
//导入包
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//起别名
typedef int ElemType;//
//定义结构体
typedef struct{
//注意ElemType存储的是类型,而int存储的是个数,所以下面的int不能用ElemType代替
ElemType *elem;//整型指针
int TableLen;//存储动态数组里边元素的个数
}SSTable;
//折半查找
int Binary_Search(SSTable L,ElemType key)
{
int low=0,high=L.TableLen-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(L.elem[mid]==key)
return mid;
else if(L.elem[mid]>key)
high=mid-1;
else
low=mid+1;
}
return -1;
}
int Search_Seq(SSTable ST,ElemType key)
{
ST.elem[0]=key;//让零号元素作为哨兵(标记)
int i;
for(i=ST.TableLen-1;ST.elemp[i]!=key;--i);
return i;
}
//随机数的生成
void ST_Init(SSTable &ST,int len)
{
ST.TableLen=len+1;//多申请一个位置,为了存放哨兵
ST.elem=(ElemType *)malloc(sizeof(ElemType)*ST.TableLen);
int i;
srand(time(NULL));//随机数的生成
for(i=0;i<ST.TableLen;i++)
{
ST.elem[i]=rand()%100;
}
}
int compare(const void *left,const void *right)//一个比较规则 left,right是任意两个元素的地址值
{
return *(ElemType*)left-*(ElemType*)right;//从小到大排序,返回正值
}
int main()
{
SSTable ST;
ElemType key;
int pos;//查询存储元素的位置
ST_Init(ST,10);
ST_print(ST);
printf("请输入要搜索的key值:\n");
scanf("%d",&key);
pos=Search_Seq(ST,key);
if(pos)
{
printf("查找成功,位置为%d\n",pos);
}
else{
printf("查找失败\n");
}
qsort(ST.elem,ST.TableLen,sizeof(int),compare);//qsort实现的是快排
ST_print(ST);
printf("二分查找,请输入要搜索的Key值:\n");
scanf("%d",&key);
//有序数组
pos=Binary_Search(ST,key);//二分查找,即折半查找。前提,数组必须是有序的
if(pos!=-1)
{
printf("查找成功,位置为%d\n",pos);
}
else{
printf("查找失败\n");
}
system("pause");
}