数据结构|在无序序列中查找数组中第k小的元素(采用快速排序法)

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值