标题
数字统计排序
问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出,次数相同时先输出值较小的数。
输入说明
输入的第一行包含一个整数n,表示给定数字的个数。 1 ≤ n ≤ 1000。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。给出的数都是不超过1000的非负整数。
输出说明
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
输入样例
12
5 2 3 3 1 3 4 2 5 2 3 5
输出样例
3 4
2 3
5 3
1 1
4 1
代码实现
#include <stdio.h>
struct ss {
int num, pos = 0;
} a[1005];
//比较大小
int min(int x, int y) {
if (x >= y) {
return y;
} else {
return x;
}
}
int max(int xx, int yy) {
if (xx >= yy) {
return xx;
} else {
return yy;
}
}
int main() {
int n, maxn = -1, minn = 1e+9;
scanf("%d", &n);
for (register int i = 1; i <= n; i++) {
int t;
scanf("%d", &t);
maxn = max(maxn, t);//记录出现的最大数字
minn = min(minn, t);//记录出现的最小数字
a[t].pos++;//记录出现次数
a[t].num = t;//存储数字
}
//类似于冒泡排序,进行符合题目顺序的更改
for (register int i = minn; i <= maxn; i++) {
for (register int j = minn; j <= maxn; j++) {//如果按照正常冒泡排序的内层去写,结果只有75分
if (a[j].pos < a[j + 1].pos) {
int t;
t = a[j + 1].pos;
a[j + 1].pos = a[j].pos;
a[j].pos = t;
t = a[j + 1].num;
a[j + 1].num = a[j].num;
a[j].num = t;
}
if (a[j].pos == a[j + 1].pos && a[j].num > a[j + 1].num) {
int tt;
tt = a[j + 1].num;
a[j + 1].num = a[j].num;
a[j].num = tt;
}
}
}
//printf("%d %d\n", a[6].pos, minn);
for (register int i = minn; i <= maxn; i++) {
if (a[i].pos > 0) {//如果出现则输出
printf("%d %d\n", a[i].num, a[i].pos);
}
}
return 0;
}
该篇文章描述了解决一个编程问题,给定一组整数,统计每个数出现的次数并按次数降序和值升序排序输出。使用C语言实现了一个结构体和冒泡排序算法来达到题目要求。
490

被折叠的 条评论
为什么被折叠?



