12.2.212.2.2 直方图

我们学习了条形图、扇形图和折线图等描述数据的统计图......我们学习了条形图、扇形图和折线图等描述数据的统计图......

事情还要从 20255292025年5月29日 说起。 那当然是某比赛,所以当天的数学培优暂停, 数学老师就给我们布置了作业:绘制直方图。那可是有 100个数据100个数据 啊!!!还好我去比赛了,没有在堂上做完。因不想统计如此庞大的数据,于是......这篇blog应运而生。

为了画直方图,需要统计数据,整理出频数分布表,所以这段代码就负责统计频数分布表。学了sort和二分查找,必须秀一波。

#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
int n, a[1000005], maxn, minn = 0x3f3f3f3f;
int cnt(int all, int alr)
{
	int rel = 0, rer = 0;
	int l = 1, r = n;
	while (l <= r)
	{
		int mid = l + (r - l) / 2;
		if (a[mid] >= all)
		{
			r = mid - 1;
			rel = mid;
		}
		else l = mid + 1;
	}
	l = 1, r = n;
	while (l <= r)
	{
		int mid = l + (r - l) / 2;
		if (a[mid] <= alr)
		{
			l = mid + 1;
			rer = mid;
		}
		else r = mid - 1;
	}
	if (rel == 0 || rer == 0)return 0;
	return rer - rel + 1;
}
signed main()
{
	printf("请输入要统计的数据的数量(小于10的6次方):");
	scanf("%d", &n);
	if (n <= 0 || n > 1000000)
	{
		cout << "输入无效";
		return 0;
	}
	printf("请输入要统计的数据(小于10的9次方,一个数字间一个换行或空格):\n");
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
		if (a[i] > 0x3f3f3f3f)
		{
			cout << "输入无效";
			return 0;
		}
		maxn = max(maxn, a[i]);
		minn = min(minn, a[i]);
	}
	int gudn;
	printf("请输入组数:");
	scanf("%d", &gudn);
	if (gudn == 0)
	{
		cout << "输入无效";
		return 0;
	}
	int potn = maxn - minn, gudw = (potn + gudn - 1) / gudn;
	printf("最大值:%d  最小值:%d  数据波动范围:%d\n", maxn, minn, potn);
	printf("组数:%d  组距:%d\n", gudn, gudw);
	sort(a + 1, a + n + 1);
	printf("频率分布:\n");
	int l = minn;
	for (int i = 1; i <= gudn; i++)
	{
		printf("%d ≤x < %d:", l, l + gudw);
		int cot = cnt(l, l + gudw - 1);
		printf("%d\n", cot);
		l += gudw;
	}
	return 0;
}

借用一下书本的样例:

样例

输入1

63
158 158 160 168 159 159 151 158 159
168 158 154 158 154 169 158 158 158
159 167 170 153 160 160 159 159 160
149 163 163 162 172 161 153 156 162
162 163 157 162 162 161 157 157 164
155 156 165 166 156 154 166 164 165
156 157 153 165 159 157 155 164 156
8

输出与书本样例完全一致:

输出1

频率分布:
149 ≤x < 152:2
152 ≤x < 155:6
155 ≤x < 158:12
158 ≤x < 161:19
161 ≤x < 164:10
164 ≤x < 167:8
167 ≤x < 170:4
170 ≤x < 173:2

输入2(昨晚作业)

95
156 162 168 158 170 165 159 163 166 169 155 172 160 164 167
171 157 173 161 154 175 153 174 162 166 158 170 165 159 163
167 171 156 172 160 164 168 173 157 155 161 174 153 175 162
166 158 170 165 159 163 167 171 156 172 160 164 168 173 157
155 161 174 153 175 162 166 158 170 165 159 163 167 171 156
172 160 164 168 173 157 155 161 174 153 175 162 166 158 170
165 159 163 167 171
6

输出2

153 ≤x < 157:13
157 ≤x < 161:18
161 ≤x < 165:18
165 ≤x < 169:19
169 ≤x < 173:15
173 ≤x < 177:12

(@D老师,快按这个blog出个二分查找的题目)


如上,今天是考试。结果。。。

后补:实际上抽到了大吉我也没有做出几道题

洛谷签到大吉