静态表查找--顺序表的查找(有序)--折半查找
2015-12-09 16:04
253 查看
静态查找表在查找的过程中不改变表的状态---不插入也不删除,适合不变动或者不经常变动的查找,顺序表可以使有序的也可以是无序的,如果是有序的可以使用折半查找,每查找一次,就把范围缩小一半,如果是无序的就只能从表的一端开始逐一查找了。
本文先用Create_Seq(SSTable &ST,ElemType r[],int n)构造一个无序的静态查找表,然后调用函数void Ascend(SSTable &ST)重建静态查找表为按照关键字为非降序排列,然后就可以进行折半查找指定的元素。
struct SSTable
{
ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用)
int length;//表的长度
};
(2)由n个数据元素的数组r,构造静态查找表ST:
(3)程序的运行结果:
(4)
折半查找算法的流程图:
本文先用Create_Seq(SSTable &ST,ElemType r[],int n)构造一个无序的静态查找表,然后调用函数void Ascend(SSTable &ST)重建静态查找表为按照关键字为非降序排列,然后就可以进行折半查找指定的元素。
#include<stdio.h> #include<malloc.h> #include<process.h> #define ERROR 0 //数据元素的类型 struct ElemType { int key; }; //静态查找表的顺序存储结构 struct SSTable { ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用) int length;//表的长度 }; //对于两个数值型变量的比较约定为如下的宏定义 #define EQ(a,b) ((a) == (b)) #define LT(a,b) ((a) < (b)) #define LQ(a,b) ((a) <= (b)) //由n个数据元素的数组r,构造静态查找表ST void Create_Seq(SSTable &ST,ElemType r[],int n) { int i; //ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType));//动态生成n+1个数据元素空间,0号单元不用 ST.elem=(ElemType*)malloc((n+1)*sizeof(ElemType)); if(!ST.elem) exit(ERROR); for(i=1;i<=n;i++) ST.elem[i]=r[i-1];//将数组的元素依次赋值给ST ST.length = n; } //重建静态查找表为按照关键字为非降序排列 void Ascend(SSTable &ST) { int i,j,k; for(i=1;i<ST.length;i++) { k=i; ST.elem[0]=ST.elem[i];//待比较的元素存入0号单元 for(j=i+1;j<=ST.length;j++) { if(LT(ST.elem[j].key,ST.elem[0].key)) { k=j; ST.elem[0]=ST.elem[j]; } } if(k != i)//有更小的值则交换 { ST.elem[k]=ST.elem[i]; ST.elem[i]=ST.elem[0]; } } } //在有序表ST中,折半查找关键字等于key的数据元素,返回在表中的位置(查找有序的顺序表) int Search_Bin(SSTable &ST,long key) { int low,mid,high; low=1; high=ST.length;//置区间初值 while(low <= high) { mid=(low+high)/2; if(EQ(ST.elem[mid].key,key)) return mid; else if(LT(key,ST.elem[mid].key)) high=mid-1;//继续在前半个区间查找 else low=mid+1;//继续在后半个区间查找 } <span style="color:#ff0000;">return 0;//没有查找到</span> } //打印ST中的元素 void Traverse(SSTable ST) { ElemType *p; int i; p=++ST.elem; for(i=1;i<=ST.length;i++,p++) printf("%d ",p->key); printf("\n"); } //顺序表的有序查找 void main() { SSTable st; int i; int s; ElemType r[5]={51,60,55,36,52};//数据元素 Create_Seq(st,r,5);//建立无序的顺序查找表 Ascend(st);//将无序的查找表重建为按照关键字非降序排列的查找表 Traverse(st); printf("请输入你要查找值得关键字:"); scanf("%d",&s); i=Search_Bin(st,s); if(i) printf("%d 是第%d个记录的关键字\n",st.elem[i].key,i); else printf("没找到!"); }(1)静态查找表的顺序存储结构
struct SSTable
{
ElemType *elem;//数据元素的存储空间的基地址,(0号单元不用)
int length;//表的长度
};
(2)由n个数据元素的数组r,构造静态查找表ST:
(3)程序的运行结果:
(4)
折半查找算法的流程图:
相关文章推荐
- Java单例设计模式
- varnish(笔记)
- javascript笔记
- 随机生成给定范围内N个不重复的数
- 目标检测学习_1(用opencv自带hog实现行人检测)
- 九宫格主页布局的实现
- Relativelayout属性
- Oracle临时表(即:Oracle 全局临时表)的语法
- Jenkins构建Android项目持续集成之系统配置篇
- 试用 OPENVMS V8.4-1H1
- Android监听ScrollView控件的滑动起始和结束事件
- 将shp中的多条属性分割为多个shp文件
- 在宏里访问结构体的成员 - rust
- MVC 页面实现ajax刷新联动下拉列表
- Ansible@一个有效的配置管理工具--Ansible configure management--翻译(四)
- php封装文件上传
- 分词 正文提取 java
- 如何在python中读写和存储matlab的数据文件(*.mat)
- 1209实验三评论
- SQL语句2