EOJ 2944 数组排序 个人错误分析


2994. 数组排序

单点时限: 2.0 sec

内存限制: 256 MB

给定一个长度为 N 的整数数组,按如下规则排序并输出。首先,输出重复出现次数最多的元素;出现次数相同时,按元素值由小到大输出。例如对于数组 1 2 3 3 4 2 3 1 5 7 排序后输出 3 3 3 1 1 2 2 4 5 7

输入格式

第 1 行:一个整数 T(1≤T≤10)为问题数。

对于每组测试数据:

第 1行是一个正整数:数组长度 N(1

第 2 行有 N 个整数:分别为第 1 至第 N个元素的值 a1,a2,?,an(?i,0≤ai<500)。任意两个整数之间由一个空格分开。

输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后在一行中输出排序后的数组元素,每两个整数之间由一个空格分开,最后一个整数后面没有空格。

样例

input
3
10
9 6 3 10 3 10 6 4 3 4
10
10 9 8 7 6 5 4 3 2 1
20
4 3 7 8 6 5 8 4 2 2 7 9 5 9 6 8 6 6 3 10
output
case #0:
3 3 3 4 4 6 6 10 10 9
case #1:
1 2 3 4 5 6 7 8 9 10
case #2:
6 6 6 6 8 8 8 2 2 3 3 4 4 5 5 7 7 9 9 10

------------------------------------------------------------------------------------------------------------------------------------

#include 
#include <string.h>
using namespace std;

int main()
{
    int t, i, temp;
    cin >> t;
    int a[501] = {0};
    int n, p = 0;
    while (t--)
    {

        cin >> n;
        for (i = 0; i < n; i++)
        {
            cin >> temp;
            a[temp]++;//(按桶装数)
        }
        int cnt = 0;
        cout << "case #" << p++ << ":" << endl;
        while (cnt < n)//(用于快速退出循环)
        {
            int max = 0, maxid = 0;
            for (i = 0; i < 500; i++)
            {
                if (a[i] > max)
                {
                    max = a[i];//最大次数
                    maxid = i;//记录数字
                }
            }
            for (int j = 0; j < max; j++, cnt++)//同时积累次数
            {
                cout << maxid;
                if (cnt != n - 1)
                    cout << ' ';
                else
                    cout << endl;
            }

            a[maxid] = -1;
        }
        for (i = 0; i < 501; i++)
            a[i] = 0;
    }
    return 0;
}
/*利用桶排序处理该问题,因为值取在500以内,不算很大,可以开500空间的数组,以角标记录数值,值记录次数(#故注意每次循环后将其清零#)
难点在于如何将这些记录了次数的容器取出并按次数排序,这里采用的是暴力破解的方法,利用一个循环操作找出次数最多的数字,记下id和次数,输出一次(这里同样记录cnt,达到n时方便直接
退出,减少时间),然后将这个最大值消掉(利用id赋值即可),然后再次循环找出次数第二多的,因为是利用了桶的特性,'出现次数相同时,按元素值由小到大输出',这条要求已经自动完成
比较轻松*/
 

相关