对含有n个互不相同元素的集合Word下载.docx
- 文档编号:20174973
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:11
- 大小:17.51KB
对含有n个互不相同元素的集合Word下载.docx
《对含有n个互不相同元素的集合Word下载.docx》由会员分享,可在线阅读,更多相关《对含有n个互不相同元素的集合Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
}
returni;
6、试写出二分查找的递归算法。
intBinarysearch(S_TBLtbl,intlow,inthigh,intkey)
if(key==tbl.elem[(low+high)/2])
printf(“Findsucceed!
”);
return(low+high)/2;
elseif(key<
tbl.elem[(low+high)/2].key)
returnBinarysearch(tbl,low,(low+high)/2-1,key);
else
returnBinarysearch(tbl,(low+high)/2+1,high-1,key);
7、在有序表上顺序查找的算法,监视哨设在高下标端。
intSearch_Sq(SSTableST,intkey)
ST.elem[ST.length+1].key=key;
for(i=1;
ST.elem[i].key>
key;
++i);
if(i>
ST.length||ST.elem[i].key<
key)
returnERROR;
}/*Search_Sq*/
分析:
本算法查找成功情况下的平均查找长度为ST.length/2,不成功情况下为ST.length.
8、折半查找的递归算法。
intSearch_Bin_Recursive(SSTableST,intkey,intlow,inthigh)
if(low>
high)
return0;
/*查找不到时返回*/
mid=(low+high)/2;
if(ST.elem[mid].key==key)
returnmid;
elseif(ST.elem[mid].key>
key)
returnSearch_Bin_Recursive(ST,key,low,mid-1);
else
returnSearch_Bin_Recursive(ST,key,mid+1,high);
}
}//Search_Bin_Recursive
9、折半查找,返回小于或等于待查元素的最后一个结点号。
intLocate_Bin(SSTableST,intkey)
int*r;
r=ST.elem;
if(key<
r.key)
elseif(key>
=r[ST.length].key)
returnST.length;
low=1;
high=ST.length;
while(low<
=high)
if(key>
=r[mid].key&
key<
r[mid+1].key)/*查找结束的条件*/
returnmid;
r[mid].key)
high=mid;
low=mid;
}/*本算法不存在查找失败的情况,不需要return0*/
}//Locate_Bin
10、分块查找,用折半查找法确定记录所在块,块内采用顺序查找法。
typedefstruct
intmaxkey;
intfirstloc;
}Index;
int*elem;
intlength;
Indexidx[MAXBLOCK];
/*每块起始位置和最大元素,其中idx[0]不利用,其内容初始化为{0,0}以利于折半查找*/
intblknum;
/*块的数目*/
}IdxSqList;
/*索引顺序表类型*/
intSearch_IdxSeq(IdxSqListL,intkey)
L.idx[L.blknum].maxkey)
/*超过最大元素*/
low=1;
high=L.blknum;
found=0;
=high&
!
found)/*折半查找记录所在块号mid*/
=L.idx[mid].maxkey&
key>
L.idx[mid-1].maxkey)
found=1;
L.idx[mid].maxkey)
low=mid+1;
high=mid-1;
i=L.idx[mid].firstloc;
/*块的下界*/
j=i+blksize-1;
/*块的上界*/
temp=L.elem[i-1];
/保存相邻元素*/
L.elem[i-1]=key;
/*设置监视哨*/
for(k=j;
L.elem[k]!
--k);
/*顺序查找*/
L.elem[i-1]=temp;
/*恢复元素*/
if(k<
i)
/*未找到*/
returnk;
}/*Search_IdxSeq*/
在块内进行顺序查找时,如果需要设置监视哨,则必须先保存相邻块的相邻元素,以免数据丢失.
11、在有序单循环链表存储结构上的查找算法,假定每次查找都成功。
LNode*h;
/*h指向最小元素*/
LNode*t;
/*t指向上次查找的结点*/
}CSList;
LNode*Search_CSList(CSList&
L,intkey)
if(L.t->
data==key)
{
returnL.t;
elseif(L.t->
data>
for(p=L.h,i=1;
p->
data!
p=p->
next,++i);
for(p=L.t,i=L.tpos;
L.t=p;
/*更新t指针*/
returnp;
}/*Search_CSList*/
由于题目中假定每次查找都是成功的,所以本算法中没有关于查找失败的处理.由微积分可得,在等概率情况下,平均查找长度约为n/3.
12、在有序双向循环链表存储结构上的查找算法,假定每次查找都成功。
DLNode*pre;
intdata;
DLNode*next;
}DLNode;
DLNode*sp;
intlength;
}DSList;
/*供查找的双向循环链表类型*/
DLNode*Search_DSList(DSList&
p=L.sp;
if(p->
data>
key)
while(p->
pre;
L.sp=p;
elseif(p->
data<
next;
}/*Search_DSList*/
13、判断二叉树T是否二叉排序树,是则返回1,否则返回0。
intlast=0;
intflag=1;
intIs_BSTree(BitreeT)
if(T->
lchild&
flag)
Is_BSTree(T->
lchild);
last)
flag=0;
/*与其中序前驱相比较*/
last=T->
data;
rchild&
rchild);
returnflag;
}/*Is_BSTree*/
14、找到二叉排序树T中小于x的最大元素和大于x的最小元素。
voidMaxLT_MinGT(BiTreeT,intx)
lchild)
MaxLT_MinGT(T->
lchild,x);
/*本算法仍是借助中序遍历来实现*/
if(last<
x&
T->
=x)/*找到了小于x的最大元素*/
printf("
a=%d\n"
last);
if(last<
=x&
x)/*找到了大于x的最小元素*/
b=%d\n"
T->
data);
rchild)
rchild,x);
}/*MaxLT_MinGT*/
15、从大到小输出二叉排序树T中所有不小于x的元素。
voidPrint_NLT(BiTreeT,intx)
Print_NLT(T->
x)
exit();
/*当遇到小于x的元素时立即结束运行*/
%d\n"
/*先右后左的中序遍历*/
}/*Print_NLT*/
16、删除二叉排序树T中所有不小于x元素结点,并释放空间。
voidDelete_NLT(BiTree&
T,intx)
Delete_NLT(T->
data<
x)
q=T;
T=T->
lchild;
free(q);
/*如果树根不小于x,则删除树根,并以左子树的根作为新的树根*/
if(T)
Delete_NLT(T,x);
/*继续在左子树中执行算法*/
}/*Delete_NLT*/
17、打印输出后继线索二叉排序树T中所有大于a且小于b的元素。
voidPrint_Between(BiThrTreeT,inta,intb)
p=T;
while(!
ltag)
/*找到最小元素*/
while(p&
p->
b)
a)
p->
/*输出符合条件的元素*/
rtag)
rtag;
rchild;
p=p->
}/*转到中序后继*/
}/*while*/
}/*Print_Between*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 含有 互不 相同 元素 集合