根据理论来说,折半查找与平衡BST树查找的性能相近,在一些情况下优于AVL树。但是折半查找的前提是关键字有序,所以在数据无序的情况下,其效率还应该加上排序所占用的时间。
其实现较简单,递归实现。代码如下:
#include <iostream>
#include <cstdlib>
#include <queue>
#include<stdio.h>
#include<string.h>
#include"math.h"
using namespace std;
int ZBBJ_sum=0;
#define N 2438
struct Info {
char name[30];
char sex[3];
char number[12];
char college[30];
};
Info* ZB_find(char *s, Info *arr, int low, int high)//迭代折半
{
int mid;
Info *node;
while(low <= high)
{
mid = (low + high) / 2;
if(strcmp(s,arr[mid].number)==0)
{
ZBBJ_sum++;
node=&arr[mid];
return node;
}else if(strcmp(s,arr[mid].number)<0)
{
ZBBJ_sum++;
high = mid - 1;
}else
{
low = mid + 1;
}
}
return NULL;
}
double ZB_asl(int n)
{
int i;
double sum = 0.0;
for (i = 1; i <= n; i++)
{
sum += log((double)i)/log(2.0);
}
double asl = sum / (double)n;
return asl;
}
int cmp(const void *a, const void *b)
{
return strcmp(((Info *)a)->number, ((Info *)b)->number);
}
int main()
{
float ZB_ASL;
int max;
char s[12]={'0'},c='Y'; //需要查找的元素
Info *arr,*T;
int i=0;
FILE *fp;
arr=new Info[N];
fp=fopen("data.txt","r");
if(!fp)
{
printf("文件打开失败,程序结束!");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s",arr[i].name,arr[i].sex,arr[i].number,arr[i].college);
i++;
}
qsort(arr, 2438, sizeof(Info), cmp);//排序
ZB_ASL=ZB_asl(N);
printf("\n折半查找最大比较次数:11次");
printf("\n折半查找ASL:%f\n",ZB_ASL);
while(c!='#')
{
printf("输入要查找的手机号码:");
fflush(stdin);
scanf("%s",s);
T=ZB_find(s, arr, 0, N - 1);
if(T)
{
printf("电话号为 %s 是 %s.其信息如下:\n",s, T->name);
printf("姓名\t性别\t电话号码\t学院\n");
printf("\n%s\t%s\t%s\t%s\n",T->name,T->sex,T->number,T->college);
printf("折半查找共比较了%d次!\n\n",ZBBJ_sum);
}
else
{
printf("\n电话号为%s的人没有找到.\n",s);
printf("折半查找共比较了%d次。\n\n",ZBBJ_sum);
}
printf("是否继续查找(#结束查找):");
fflush(stdin);
c=getchar();
ZBBJ_sum=0;
}
fclose(fp);
return 0;
}
结果如下:
本文基于vs2010旗舰版编译器,使用其他编译器可能需要改动代码才可以运行,如果有错误,欢迎讨论。