北理工数据结构作业5.docx
《北理工数据结构作业5.docx》由会员分享,可在线阅读,更多相关《北理工数据结构作业5.docx(9页珍藏版)》请在冰豆网上搜索。
![北理工数据结构作业5.docx](https://file1.bdocx.com/fileroot1/2023-1/6/b9f793f7-a234-46f7-859c-18cc06dd7cef/b9f793f7-a234-46f7-859c-18cc06dd7cef1.gif)
北理工数据结构作业5
第九章作业
1、分别画出在线性表(a,b,c,d,e,f,g)中进行折半查找,以查关键字等于e、f和g的过程。
(1)查e
1):
abcdefg
↑low↑mid↑high
此时d说明d若存在,必在区间[mid+1,high]
令low=mid+1;
2):
abcdefg
↑↑↑
lowmidhigh
此时f>e
说明d若存在,必在区间[low,mid-1]
令high=mid–1;
3):
abcdefg
high↑low
↑mid
此时mid指向的元素为e,查找成功;
(2)查f
1):
abcdefg
↑low↑mid↑high
此时d说明f若存在,必在区间[mid+1,high]
令low=mid+1;
2):
abcdefg
↑↑↑
lowmidhigh
此时mid指向的元素为f,查找成功;
(3)查g
1):
abcdefg
↑low↑mid↑high
此时d说明g若存在,必在区间[mid+1,high]
令low=mid+1;
2):
abcdefg
↑↑↑
lowmidhigh
此时f说明g若存在,必在区间[mid+1,high]
令low=mid+1;
3):
abcdefg
high↑low
↑mid
此时mid指向的元素为g,查找成功;
2、请将折半查找的算法改写为递归算法。
intBinSearch(SSTables;intlow,inthigh;keyTypeK)
{
if(low>high)return0;
else{
mid=(low+high)/2;
switch{
cases.elem[mid].keyreturnBinSearch(s,mid+1,high,K);
break;
cases.elem[mid].key==K:
returnmid;
break;
cases.elem[mid].key>K:
returnBinSearch(s,low,mid-1,K);
break;
default:
;
}//switch
}//else
}//BinSearch
3、编写判别给定二叉树是否为二叉排序树的算法。
假设此二叉树是以二叉链表的形式存储的,且树中关键字均不同。
typedefstructBiTNode{
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
intflag=1,last=0;
intBiSortTree(BitreeT)//判断二叉树T是否二叉排序树,是则返回1,否则返回0
{
if(T->lchild&&flag)BiSortTree(T->lchild);
if(T->datadata与其中序前驱last比较大小
last=T->data;
if(T->rchild&&flag)BiSortTree(T->rchild);
returnflag;
}//BiSortTree
实验四
输入10个数,从插入排序、快速排序、选择排序三类算法中各选一种编程实现。
程序如下(均为.cpp)
插入排序:
#include
#defineMAXSIZE100
#defineERROR0
typedefstruct{
intR[MAXSIZE+1];
intlength;
}SqList;
voidInsertSort(SqList&L)
{//对顺序表L作直接插入排序
inti,j;
for(i=2;i<=L.length;++i)
if(L.R[i]{
L.R[0]=L.R[i];
L.R[i]=L.R[i-1];
for(j=i-2;L.R[0]L.R[j+1]=L.R[j];
L.R[j+1]=L.R[0];
}
}
main()
{
inti,n;
SqListL;
printf("inputtotalnumberofthesequence:
\n");
scanf("%d",&n);
if(n<=0||n>MAXSIZE)
{
printf("nmustmorethan0andlessthan%d.\n",MAXSIZE);
returnERROR;
}
L.length=n;
printf("inputtheelements:
\n");
for(i=1;i<=n;i++)
scanf("%d",&L.R[i]);
InsertSort(L);
printf("\nSequenceaftersort:
\n");
for(i=1;i<=n;i++)
printf("%4d",L.R[i]);
}
快速排序:
#include
#defineMAXSIZE100
#defineERROR0
typedefstruct{
intR[MAXSIZE+1];
intlength;
}SqList;
intPartition(SqList&L,intlow,inthigh){
intp;
L.R[0]=L.R[low];
p=L.R[low];
while(lowwhile(low=p)
--high;
L.R[low]=L.R[high];
while(low++low;
L.R[high]=L.R[low];
}
L.R[low]=L.R[0];
returnlow;
}
voidQSort(SqList&L,intlow,inthigh){
intp;
if(lowp=Partition(L,low,high);
QSort(L,low,p-1);
QSort(L,p+1,high);
}
}
voidQuickSort(SqList&L){
QSort(L,1,L.length);
}
main()
{
inti,n;
SqListL;
printf("inputtotalnumberofthesequence:
\n");
scanf("%d",&n);
if(n<=0||n>MAXSIZE)
{
printf("nmustmorethan0andlessthan%d.\n",MAXSIZE);
returnERROR;
}
L.length=n;
printf("inputtheelements:
\n");
for(i=1;i<=n;i++)
scanf("%d",&L.R[i]);
QuickSort(L);
printf("\nSequenceaftersort:
\n");
for(i=1;i<=n;i++)
printf("%4d",L.R[i]);
}
选择排序:
#include
#defineMAXSIZE100
#defineERROR0
typedefstruct{
intR[MAXSIZE+1];
intlength;
}SqList;
voidSelectSort(SqList&L)
{
inti,j,k;
for(i=1;i{
k=i;
for(j=i+1;j<=L.length;j++)
if(L.R[j]k=j;
if(k!
=i)
{
L.R[0]=L.R[i];L.R[i]=L.R[k];L.R[k]=L.R[0];
}
}
}
main()
{
inti,n;
SqListL;
printf("inputtotalnumberofthesequence:
\n");
scanf("%d",&n);
if(n<=0||n>MAXSIZE)
{
printf("nmustmorethan0andlessthan%d.\n",MAXSIZE);
returnERROR;
}
L.length=n;
printf("inputtheelements:
\n");
for(i=1;i<=n;i++)
scanf("%d",&L.R[i]);
SelectSort(L);
printf("\nSequenceaftersort:
\n");
for(i=1;i<=n;i++)
printf("%4d",L.R[i]);
}