数组找中位数(C++)
题目描述
中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
输入描述:
该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1<=N<=10000.
接着N行为N个数据的输入,N=0时结束输入
输出描述:
输出中位数,每一组测试数据输出一行
示例1
输入:
4
10
30
20
40
3
40
30
50
4
1
2
3
4
0
输出:
25
40
2
解决思路
先处理输入和输出
接受总的个数n
再写一个循环,接受n个元素存入数组,对数组进行排序
之后就可以直接找出中位数
如果n为偶数,中位数为(n/2+n/2+1)/2
如果n为奇数,中位数为n/2+1
#define _CRT_SECURE_NO_WARNINGS 1 //防止VS studio报错
#include<iostream>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int data[1000];
int i = 0, j = 0;
//接收数组输入
while (i < n) {
scanf("%d", &data[i]);
i++;
}
//排序,也可以引用头文件,直接用函数sort()排序
for (i = 0; i < n; i++)
for (j = i; j < n; j++)
if (data[j] < data[i])
{
int t = data[i];
data[i] = data[j];
data[j] = t;
}
//下面注释掉部分是为了方便进行调试打印
/*for (i = 0; i < n; i++)
{
cout <<i<<"="<< data[i]<<endl;
}*/
//cout << "n%2=" << n%2<< endl;
//cout << "n/2=" << n /2 << endl;
int a = n - 1;
//注意n是元素的个数,但数组是从0下标开始存储的,找中位数是下标要减一
if (n % 2 == 0)
cout << (data[n / 2]+data[n/2-1]) / 2 << endl;
else
cout << (data[n/2]) << endl;
return 0;
}