【问题描述】
  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。 
【输入形式】
  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。 
【输出形式】
  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
【样例输入】
  12
  5 2 3 3 1 3 4 2 5 2 3 5 
【样例输出】
  3 4
  2 3
  5 3
  1 1
  4 1 
【评分标准】
  评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
思路:
(1)将每个数字与其出现频率绑定定义为Pair类,定义Pair类数组;
(2)接收输入,判断输入数字是否存在,存在则对应数字频率加一,不存在则写入数字并频率加一;
(3)sort函数自定义排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
   | #include <iostream> #include <algorithm> #define N 1000		 using  namespace  std;
  class Pair { public: 	int num = 0;	 	int fre = 0;	 };
  int inArray(int n, Pair *p, int &pos) { 	for (int i = 0; i < pos; i++) 	{ 		if (p[i].num == n) 		{ 			p[i].fre++; 			return 1;	 		} 	}
  	p[pos].num = n; 	p[pos].fre++; 	pos++; 	return 0;	 }
  bool cmp_fre(Pair x, Pair y) { 	if (x.fre == y.fre) 		return x.num < y.num;
  	return x.fre > y.fre; }
  void out(Pair *p, int n) { 	for (int i = 0; i < n; i++) 	{ 		cout << p[i].num << ' ' << p[i].fre << endl; 	} }
  void initial(Pair *p, int n, int &pos) { 	int temp; 
  	for (int i = 0; i < n; i++) 	{ 		cin >> temp; 		inArray(temp, p, pos);	 	} }
  int  main() { 	int n, pos = 0;		 	Pair pair[N];		 	cin >> n;			
  	initial(pair, n, pos); 	sort(pair, pair + pos, cmp_fre); 	out(pair, pos);
  	return 0; }
   | 
 
如果有更好的写法欢迎在评论区给出噢^_^