本题要求实现一个函数,求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];
}