版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 查找1、对含有n个互不相同元素的集合,同时找最大元和最小元至少需进行多少次比较? 找最大元和最小元至少需要进行n-1次比较。2、若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试讨论在查找成功两者在等概率时的平均查找长度: 有序表与无序表一样,都为(n+1)/2。3、为什么有序的单链表不能进行折半查找? 因为折半查找需要随机知道每个数据元素的位置,这是单链表做不到的。4、对给定的关键字集合,以不同的次序插入初始为空的树中,是否有可能得到同一棵二叉排序树? 不可能。5、写出顺序表上实现顺序查找的算法,并将监视哨设在高地址端。 int seqsearch(S_TB
2、L tbl, int key) tbl.elem0.key = key; int i = 0; for(i = tbl.length; i >= 0 && tbl.elemi.key != key; -i) ;return i;6、试写出二分查找的递归算法。 int Binarysearch(S_TBL tbl, int low, int high, int key) if(key = tbl.elem(low+high)/2) printf(“Find succeed!”); return (low+high)/2;else if(key < tbl.elem(l
3、ow+high)/2.key) return Binarysearch(tbl, low, (low+high)/2-1, key);else return Binarysearch(tbl, (low+high)/2+1, high-1, key);7、在有序表上顺序查找的算法,监视哨设在高下标端。int Search_Sq(SSTable ST,int key) ST.elemST.length+1.key = key; for(i = 1;ST.elemi.key > key;+i); if(i > ST.l
4、ength | ST.elemi.key < key) return ERROR; return i;/*Search_Sq*/分析:本算法查找成功情况下的平均查找长度为ST.length/2,不成功情况下为ST.length. 8、折半查找的递归算法。int Search_Bin_Recursive(SSTable ST,int key,int low,int high) if(low > high) return 0; /*查找不到时返回*/ mid = (low+high)/2; if(S
5、T.elemmid.key = key) return mid; else if(ST.elemmid.key>key) return Search_Bin_Recursive(ST,key,low,mid-1); else return Search_Bin_Recursive(ST,key,mid+1,high); /Search_Bin_Recursive 9、折半查找,返回小于或等于待查元素的最后一个结点号。int Locate_Bin(SSTable ST,int key) int *r
6、; r = ST.elem; if(key < r.key) return 0; else if(key >= rST.length.key) return ST.length; low = 1;high = ST.length; while(low <= high) mid = (low+high)/2;if(key >= rmid.key && key < rmid+
7、1.key) /*查找结束的条件*/ return mid;else if(key < rmid.key) high = mid;else low = mid; /*本算法不存在查找失败的情况,不需要return 0*/Locate_Bin 10、分块查找,用折半查找法确定记录所在块,块内采用顺序查找法。typedef struct int maxkey;int firstloc; Index; typedef struct int *elem; int length;Index
8、 idxMAXBLOCK; /*每块起始位置和最大元素,其中idx0不利用,其内容初始化为0,0以利于折半查找*/ int blknum; /*块的数目*/ IdxSqList; /*索引顺序表类型 */int Search_IdxSeq(IdxSqList L,int key) if(key > L.idxL.blknum.maxkey) return ERROR; /*超过最大元素*/ low = 1;high = L.blknum; found = 0; while(low &l
9、t;= high && !found) /*折半查找记录所在块号mid*/ mid = (low+high)/2;if(key <= L.idxmid.maxkey && key > L.idxmid-1.maxkey) found = 1;else if(key > L.idxmid.maxkey) low = mid+1;else
10、high=mid-1; i = L.idxmid.firstloc; /*块的下界*/ j = i + blksize - 1; /*块的上界*/ temp = L.elemi-1; /保存相邻元素*/ L.elemi-1 = key; /*设置监视哨*/ for(k = j;L.elemk != key; -k); /*顺序查找*/ L.elemi-1 = temp; /*恢复元素*/ if(k < i) re
11、turn ERROR; /*未找到*/ return k;/*Search_IdxSeq*/分析:在块内进行顺序查找时,如果需要设置监视哨,则必须先保存相邻块的相邻元素,以免数据丢失. 11、在有序单循环链表存储结构上的查找算法,假定每次查找都成功。typedef struct LNode *h; /*h指向最小元素*/LNode *t; /*t指向上次查找的结点*/ CSList; LNode *Search_CSList(CSList &L,int key) if(L.t->data = key) return L.t;
12、; else if(L.t->data>key) for(p = L.h,i = 1;p->data != key;p = p->next,+i); else for(p = L.t,i = L.tpos;p->data != key;p = p->next,+i); L.t = p; /*更新t指针*/ return p;/*Search_CSList*/分析:由于题目中假定每次查找都是成功的,所以本算法中没有关于查找失败的处理.由微积分可得,在等概率情况下,平均查找长度约为n/3
13、. 12、在有序双向循环链表存储结构上的查找算法,假定每次查找都成功。typedef struct DLNode *pre;int data;DLNode *next; DLNode; typedef struct DLNode *sp;int length; DSList; /*供查找的双向循环链表类型 */DLNode *Search_DSList(DSList &L,int key) p = L.sp; if(p->data > key) while(p->data > key) p =
14、p->pre; L.sp = p; else if(p->data < key) while(p->data < key) p = p->next; L.sp = p; return p;/*Search_DSList*/13、判断二叉树T是否二叉排序树,是则返回1,否则返回0。int last = 0;int flag = 1; int Is_BSTre
15、e(Bitree T) if(T->lchild && flag) Is_BSTree(T->lchild); if(T->data < last) flag=0; /*与其中序前驱相比较*/ last = T->data; if(T->rchild && flag) Is_BSTree(T->rchild); return flag;/*Is_BSTree */14、找到二叉排序树T中小于x的最大元素和大于x的
16、最小元素。int last = 0; void MaxLT_MinGT(BiTree T,int x) if(T->lchild) MaxLT_MinGT(T->lchild,x); /*本算法仍是借助中序遍历来实现*/ if(last<x && T->data >= x) /*找到了小于x的最大元素*/ printf("a=%dn",last); if(last <= x && T->data > x) /*找到了大于x的最
17、小元素*/ printf("b=%dn",T->data); last = T->data; if(T->rchild) MaxLT_MinGT(T->rchild,x);/*MaxLT_MinGT */15、从大到小输出二叉排序树T中所有不小于x的元素。void Print_NLT(BiTree T,int x) if(T->rchild) Print_NLT(T->rchild,x); if(T->data < x) exit();
18、/*当遇到小于x的元素时立即结束运行*/ printf("%dn",T->data); if(T->lchild) Print_NLT(T->lchild,x); /*先右后左的中序遍历*/*Print_NLT */16、删除二叉排序树T中所有不小于x元素结点,并释放空间。void Delete_NLT(BiTree &T,int x) if(T->rchild) Delete_NLT(T->rchild,x); if(T->data<x) exit(); /*当遇到小于x的元素时立即结束运行*/ q = T; T = T->lchild; free(q); /*如果树根不小于x,则删除树根,并以左子树的根作为新的树根*/ i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 济南小企业内部控制制度
- 湖南发展内部审计制度
- 煤矿内部考勤制度
- 牧原猪场内部管理制度
- 环境监察内部控制制度
- 画室内部治安保卫制度
- 监理人员内部管理制度
- 监理单位内部保卫制度
- 禁毒办内部例会制度
- 科室内部积分管理制度
- 【2026春】部编版八年级下册语文读读写写(注音+解释)
- 初中历史历史互动传承的文化遗产课题报告教学研究课题报告
- 《PMC新型固体燃料》-编制说明
- 乡镇消防制度管理制度
- 公共卫生组织管理工作计划(31篇)
- 电厂值长培训课件
- 2026年湖南机电职业技术学院单招综合素质考试题库附答案
- (正式版)DB51∕T 3326-2025 《展会现场服务规范》
- 小学劳动课《收纳》
- 食品生产加工小作坊许可申请书
- 医疗设备维护与质量控制
评论
0/150
提交评论