当前位置:文档之家› 数据结构折半排序查找

数据结构折半排序查找

折半查询
一、实验目的
1,掌握排序算法及基本思想及实现的技术;能够根据实际问题特点的要求选择合理的排序方法,理解排序在数据处理中的重要性;
2.学会比较各种排序方法的稳定性分析以及在最好、最坏和平均情况的时间性能分析。

3.掌握顺序查找和折半查找两种查找的算法及实现技术;了解它们各自的优缺点。

4.熟悉各种查找方法的适用范围和条件;掌握顺序查找、折半查找的基本思想及效率分析。

二、实验环境
1.硬件:每个学生需配备计算机一台。

操作系统:DOS或Windows
2.软件:DOS或Windows操作系统+Turbo C;
三、实验要求
1.本次实验较为简单,每个同学独立按时完成,通过实验掌握记录的概念,为以后数据库技术打好基础。

2.如果输入数据较为繁琐,可减低每个班的人数。

3.输入输出数据要有提示,方便用户操作。

四、实验内容
1.现在某个学院有20名同学分属于2个班级(Class1和Class2,每个班有10名同学,每个同学记录包括:班级、学号、姓名、性别、电话号码等信息)。

2.以学号为主关键字,以班级为次关键字,建立一个顺序表,表中的每个数据元素是一个记录,其中的某个域用来存储关键字的值,按关键字的值进行顺序查找。

为分析排序方法的稳定性,关键字可用次关键字。

#include"stdio.h"
#include"malloc.h"
#include"string.h"
typedef struct
{int cla;
int num;
char name[7];
char sex;
long phnum;
}stu_hc;
typedef struct
{stu_hc *elem;
int length;
int sum;
}sqlist_hc;
sqlist_hc *initlist_hc()
{sqlist_hc *l;int n;
l=(sqlist_hc*)malloc(sizeof(sqlist_hc));
if(!l)printf("出错!\n");
printf("输入学生人数:");scanf("%d",&n);
l->length=0;l->sum=n;
l->elem=(stu_hc*)malloc(n*sizeof(stu_hc));
if(!l->elem)printf("出错!\n");
return(l);}
int place_hc(sqlist_hc *l,int c,int num)
{int low,high,mid,j=-1,i;
low=0;high=l->length-1;
while(low<=high)
{mid=(low+high)/2;
if(l->elem[mid].num>num)high=mid-1;
else{j=mid;low=mid+1;}}
i=j;
for(j=mid;j>=i;j--)
{if(j==-1||num>l->elem[j].num)break;
else if(num==l->elem[j].num&&c>l->elem[j].cla)break;} return(++j);}
void move_hc(sqlist_hc *l,int j)
{int i;
for(i=l->length-1;i>=j;i--)
{l->elem[i+1].cla=l->elem[i].cla;
strcpy(l->elem[i+1].name,l->elem[i].name);
l->elem[i+1].num=l->elem[i].num;
l->elem[i+1].sex=l->elem[i].sex;
l->elem[i+1].phnum=l->elem[i].phnum;}}
void createlist_hc(sqlist_hc *l)
{int i,j,c,num;
char nam[7],s;long p;
printf("输入学生信息(class name num sex phonenum):\n"); for(i=0;i<l->sum;i++)
{flushall();
scanf("%d %s %d %c %ld",&c,nam,&num,&s,&p);
j=!(l->length)?0:place_hc(l,c,num);
move_hc(l,j);
l->elem[j].cla=c;
strcpy(l->elem[j].name,nam);
l->elem[j].num=num;
l->elem[j].sex=s;
l->elem[j].phnum=p;
l->length++;}}
void seekstu_hc(sqlist_hc *l)
{int low,high,mid,num,c;
printf("输入查找人的学号和班级号:");
scanf("%d %d",&num,&c);
while(num!=-1||c!=-1)
{low=0;high=l->length-1;
while(low<=high)
{mid=(low+high)/2;
if(l->elem[mid].num<num)low=mid+1;
else if(l->elem[mid].num>num)high=mid-1;
else{if(l->elem[mid].cla<c)mid++;
else if(l->elem[mid].cla>c)mid--;
break;}}
printf("%d,%s,%d,%c,%ld\n",l->elem[mid].cla,l->elem[mid].name,l->elem[mid].num,l->elem[mid].sex,l->elem[ mid].phnum);
printf("输入查找人的学号和班级号:");
scanf("%d %d",&num,&c);}}
void printlist_hc(sqlist_hc*l)
{int i,j=0;
printf("当前表中信息如下:class/name/num/sex/phonenum\n");
for(i=0;i<l->sum;i++)
{printf("%d/%s/%d/%c/%ld
",l->elem[i].cla,l->elem[i].name,l->elem[i].num,l->elem[i].sex,l->elem[i].phnum);
if(++j==3){j=0;printf("\n");}}
printf("\n");}
main()
{sqlist_hc *l;
l=initlist_hc();
createlist_hc(l);
printlist_hc(l);
seekstu_hc(l);
printf("作者:黄晨");}。

相关主题