6-11 求自定类型元素序列的中位数 (25 分)

本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的类型为自定义的ElementType

题目分析:

找中位数肯定先要排序,以我对陈越姥姥的了解,O(n2)的算法肯定会被干掉,至少要O(nlogn)的算法才行,我之前费了好大力气才学会了归并排序,那就只能用这个了。题目是2021-9-16提交的,当时还不会递归,只好硬着头皮用循环来实现归并排序。在函数ElementType Median里面,第一层循环,原始版本是for ( i=2; i/2<N; i*=2 ),虽然也能通过,但后来发现某些情况下归并段没有覆盖到所有数据,还应该再归并一次,就改成了现在的 i/2<=N了。留个记录说明一下,免得以后我自己忘了。

void Merge(ElementType *arr, ElementType *temp, int startid, int midid, int endid)
{
	if ( startid>=endid ) return;
	int i=startid, j=midid, k=startid;
	while ( i<midid && j<=endid )
		arr[i]<=arr[j] ? ( temp[k++]=arr[i++] ) : ( temp[k++]=arr[j++] ) ;
	while ( i<midid )
		temp[k++]=arr[i++];
	while ( j<=endid )
		temp[k++]=arr[j++];
	for ( i=startid; i<=endid; i++ )
		arr[i] = temp[i];
}

ElementType Median( ElementType A[], int N )
{
	ElementType temp[MAXN];
	int i, j, startid, midid, endid;
	
	for ( i=2; i/2<=N; i*=2 ) {
		for ( j=0; j<N; j+=i ) {
			if ( j+i-1 < N ) {
				startid = j;
				midid = j + i / 2;
				endid = j + i - 1;
			} else {
				startid = j;
				midid = j + i / 2;
				endid = N - 1;
				if ( midid>endid ) midid=endid;
			}
			Merge(A, temp, startid, midid, endid);
		}
	}
	
	return A[N/2];
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值