题1:
有一个含有n个整数的无序数据序列,所有的数据元素均不相同,采用整数数组R[0..n-1]存储,请设计一个尽可能高效的算法,输出该序列中第k(1≤k≤n)小的元素
int QuickSelect(int R[],int s,int t,int k) //在R[s..t]序列中找第k小的元素
{ int i=s,j=t;
int tmp;
if (s<t) //区段内至少存在2个元素的情况
{ tmp=R[s]; //用区段的第1个记录作为基准
while (i!=j) //从区段两端交替向中间扫描,直至i=j为止
{ while (j>i && R[j]>=tmp)
j--; //从右向左扫描,找第1个小于tmp的R[j]
R[i]=R[j]; //将R[j]前移到R[i]的位置
while (i<j && R[i]<=tmp)
i++; //从左向右扫描,找第1个大于tmp的R[i]
R[j]=R[i]; //将R[i]后移到R[j]的位置
}
R[i]=tmp;
if (k-1==i) return R[i];
else if (k-1<i) return QuickSelect(R,s,i-1,k); //在左区段中递归查找
else return QuickSelect(R,i+1,t,k); //在右区段中递归查找
}
else if (s==t && s==k-1) //区段内只有一个元素且为R[k-1]
return R[k-1];
}
void Mink(int R[],int n,int k) //输出整数数组R[0..n-1]中第k小的元素
{ if (k>=1 && k<=n)
printf("%d\n", QuickSelect( R,0,n-1,k));
}
题2:
假设二叉树b采用二叉链存储结构,设计一个算法void findparent(BTNode *b,ElemType x,BTNode *&p)求指定值为x的结点的双亲结点p。提示,根结点的双亲为NULL,若在二叉树b中未找到值为x的结点,p亦为NULL
void findparent(BTNode *b,ElemType x,BTNode *&p)
{ if (b!=NULL)
{ if (b->data==x) p=NULL;
else if (b->lchild!=NULL && b->lchild->data==x)
p=b;
else if (b->rchild!=NULL && b->rchild->data==x)
p=b;
else
{ findparent(b->lchild,x,p);
if (p==NULL)
findparent(b->rchild,x,p);
}
}
else p=NULL;
}