数字统计排序(xdoj167)

标题    
数字统计排序

类别
综合    

时间限制    
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;
			}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值