您的位置:首页 > 其它

求自定类型元素序列的中位数

2016-03-20 16:52 387 查看
/*
求自定类型元素序列的中位数   


其中给定集合元素存放在数组
A[]
中,正整数
N
是数组元素个数。该函数须返回
N
A[]
元素的中位数,其值也必须是
ElementType
类型。

*/

#include <stdio.h>

#define MAXN 10
typedef float ElementType;

ElementType Median( ElementType A[], int N );

int main ()
{
ElementType A[MAXN];
int N, i;

while(scanf("%d", &N) != EOF)
{
for ( i=0; i<N; i++ )
scanf("%f", &A[i]);
printf("%.2f\n", Median(A, N));
}

return 0;
}

void HeapAdjust(ElementType array[], int i, int nlength)
{
int nChild;
ElementType nTemp;
for (; 2 * i + 1 < nlength; i = nChild)
{
nChild = 2 * i + 1;
//得到子节点中较大的节点
if (nChild < nlength - 1 && array[nChild + 1] > array[nChild])
nChild++;
//如果较大的子节点大于父节点那么把较大的子节点往上移动,替换它的父节点
if (array[i] < array[nChild])
{
nTemp = array[i];
array[i] = array[nChild];
array[nChild] = nTemp;
}
else
break;
}
}
void Heapsort(ElementType array[], int length)
{
int i;//调整序列的前半部分元素,调整完之后第一个元素是序列的最大元素
ElementType temp;
for (i = length / 2 - 1; i >= 0; i--)
HeapAdjust(array, i, length);
//从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
for (i = length - 1; i >= 0; i--)
{
//把第一个元素和当前的最后一个元素交换
//保证当前的最后一个位置的元素都是现在这个序列中最大的
temp = array[0];
array[0] = array[i];
array[i] = temp;
//不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
HeapAdjust(array, 0, i);
}
}
ElementType Median(ElementType A[], int N)
{
Heapsort(A, N);
return A[N / 2];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: