题1:

有一个含有n个整数的无序数据序列,所有的数据元素均不相同,采用整数数组R[0..n-1]存储,请设计一个尽可能高效的算法,输出该序列中第k(1≤kn)小的元素

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;
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐