c语言怎么找数组的中位数?C语言求元素序列的中位数
c语言怎么找数组的中位数?C语言求元素序列的中位数//求自定类型元素序列的中位数 #include <stdio.h> #define MAXN 10 typedef float ElementType; ElementType Median( ElementType A[] int N ); int main () { ElementType A[MAXN]; int N i; scanf("%d" &N); for ( i=0; i<N; i ) scanf("%f" &A[i]); printf("%.2f\n" Median(A N)); return 0; } ElementType Median(ElementType A[] int N){ //数组A中存储
今天这道题目呢,可以说是函数篇当中最难的一道题,以及分数比重最高的一道题。
它的要求是:实现一个函数,求N个集合元素A[]的中位数,即序列中第[(N 1)/2]大的元素。
以题目给定的测试输入用例为例:
给定N=3的数,分别是12.3,34和-5,从大到小排序得到34,12.3,-5。
其中的中位数则是12.3,然后保留两位小数以12.30的形式打印出来即可。
这道题目的逻辑其实很简单,就是将给定的数进行一个从大到小的排序,然后挑选出第[(N 1)/2]大的元素,保留两位小数打印出来即可。
但在实际进行编程的时候,难度就体现出来了。
//求自定类型元素序列的中位数
#include <stdio.h>
#define MAXN 10
typedef float ElementType;
ElementType Median( ElementType A[] int N );
int main ()
{
ElementType A[MAXN];
int N i;
scanf("%d" &N);
for ( i=0; i<N; i )
scanf("%f" &A[i]);
printf("%.2f\n" Median(A N));
return 0;
}
ElementType Median(ElementType A[] int N){
//数组A中存储的就是那几个元素
//与冒泡排序类似,要整一个临时变量用于交换位置
int k;
ElementType TempStore;//临时变量用于临时存储
for (int i = N/2; i > 0; i = i/2) {//从N/2开始,因为找寻中位数
for (int j = i; j < N; j ) {//要找到中间的那个数,然后与之前的数比较
TempStore = A[j];//将找寻到的中位数给存储到中间变量当中
for (k = j; k >= i; k = k - i) {
if (TempStore < A[k - i]){//把中位数的数与第一个元素进行比较,如果中位数小,那就交换位置
A[k] = A[k - i];//交换位置
}
else{
break;//如果中位数大了,那就不需要交换位置了
}
}
A[k] = TempStore;//进行循环之后,得到的结果就是正确的
}
}
return A[N/2];
}
结果测试
总的来说,这道题目关键难点在于不容易想到解题的方法,就是从中间位置的点开始找寻,然后像冒泡排序一样准备一个临时变量,然后比较大小交换位置。