数字排序问题(c++实现)
描述:给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入:输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出:输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
input:
12
5 2 3 3 1 3 4 2 5 2 3 5
output:
3 4 2 3 5 3 1 1 4 1
下面有改进版
/*
分析:该题难点在于按出现次数递减的顺序输出整数和他出现的次数,所以需要二维数组a[10][2],其中a[][0]存整数,a[][1]存该整数出现次数,排序时整体交换,如果出现相同则线输出较小的再输出较大的,这里用到一个小技巧,具体看代码。
1 #include<iostream> 2 using namespace std; 3 4 void sort(int a[][2]) 5 { 6 int min; 7 int n = 0; 8 for (int i = 0; i < 10; i++) //只对个数不为0的数字进行排序,由于初始是从小到大拍的,排序完成后相同的也是按从小到大 9 { 10 if (a[i][1] != 0) 11 n++; 12 } 13 for (int i = 0; i < n; i++) 14 { 15 for (int i = 0;; i++) 16 { 17 if (a[i][1] != 0) 18 { 19 min = i; 20 break; 21 } 22 } 23 24 for (int j = 0; j <= 9 - i; j++) 25 { 26 if (a[j][1]!=0) 27 if (a[min][1] >= a[j][1]) 28 min = j; 29 } 30 int x = a[min][0], y = a[min][1]; 31 a[min][0] = a[9 - i][0]; a[min][1] = a[9 - i][1]; 32 a[9 - i][0] = x; a[9 - i][1] = y; 33 } 34 } 35 int main() 36 { 37 int n,x; 38 static int a[10][2]; 39 cin >> n; 40 for (int i = 0; i < 10; i++) 41 a[i][0] = i; 42 for (int i = 0; i < n; i++) 43 { 44 cin >> x; 45 a[x][1]++; 46 } 47 sort(a); 48 for (int i = 0; i < 10; i++) 49 { 50 if (a[i][1] != 0) 51 cout << a[i][0] << " " << a[i][1] << endl; 52 } 53 system("pause"); 54 return 0; 55 }
*/
PS:感觉写麻烦了,欢迎有简化方法的交流。。。。
下面是改进版本,更好的符合题意。输入的数字可以为任意值。
1 #include<iostream> 2 using namespace std; 3 //交换函数 4 void ch(int a[][2], int x, int y) 5 { 6 int b = a[x][0], c = a[x][1]; 7 a[x][0] = a[y][0]; a[x][1] = a[y][1]; 8 a[y][0] = b; a[y][1] = c; 9 } 10 //判断该数字是否在存在数组中,如果存在返回行标 11 int judge(int a[][2], int x) 12 { 13 for (int i = 0; i<100; i++) 14 { 15 if (a[i][0] == x) 16 return i; 17 } 18 return -1; 19 } 20 21 int main() 22 { 23 int x, n, j = 0, k; 24 static int a[100][2]; //出现整数的种类不能超过100种,可根据需要加大 25 cin >> n; 26 for (int i = 0; i<n; i++) 27 { 28 cin >> x; 29 k = judge(a, x); 30 if (k>=0) 31 a[k][1]++; 32 else 33 { 34 a[j][0] = x; 35 a[j][1]++; 36 j++; 37 } 38 } 39 //对a[][1]排序 40 int min; 41 for (int i = 0; i<j - 1; i++) 42 { 43 min = 0; 44 for (int k = 0; k < j - i; k++) 45 { 46 if (a[k][1] < a[min][1]) 47 min = k; 48 if (a[k][1] == a[min][1]) //为了满足如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的 49 if (a[k][0] > a[min][0]) 50 min = k; 51 } 52 ch(a, min, j - i-1); 53 } 54 for (int i = 0; i<j; i++) 55 cout << a[i][0] << " " << a[i][1] << endl; 56 system("pause"); 57 return 0; 58 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下