數字排序問題(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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM