标题
数字统计排序
类别
综合
时间限制
1S
内存限制
256Kb
问题描述
给定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>
int main() {
int sort(int *p, int n);
int n, a[100], a1[100], temp, x, sum[100], sum1[100] = {0};
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);//输入数字
sort(a, n);//冒泡排序
for (int i = 0; i < n; i++) {
sum[i] = 1;
for (int j = 1; j < n - i; j++) {
if (a[i] == a[i + j])
sum[i]++;
}//检索每一个元素在他后面出现次数
}
int k = 0;
for (int i = 0; i < n; i++) {
a1[k] = a[i];
sum1[k] = sum[i];
i = i + sum[i] - 1;
k++;
}//保存每个数字出现的最大次数
for (int i = 0; i < k - 1; i++)
for (int j = 0; j < k - 1 - i; j++)
if (sum1[j] < sum1[j + 1]) {
temp = sum1[j];
sum1[j] = sum1[j + 1];
sum1[j + 1] = temp;
x = a1[j];
a1[j] = a1[j + 1];
a1[j + 1] = x;
}//按照出现次数进行排序,同时对应的数字也对应改变位置
for (int i = 0; i < k; i++)
printf("%d %d\n", a1[i], sum1[i]);
}
int sort(int *p, int n) {
int temp;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
if (*(p + j) > *(p + j + 1)) {
temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}