关于#c++#数字排序的问题

为什么这个题我这样的解法就不对呀?

img

#include <iostream>
#define endl '\n'
using namespace std;
int n=0;
int a[1000]={0};
int sign[1001]={0};

int findmax()
{
    int max=0;
    int maxnum=0;
    for(int i=0;i<1000;i++)
    {
        if(sign[i]==0)
        {
            continue;
        }
         else
         {
             if(sign[i]>maxnum)
             {
                 max=i;
                 maxnum=sign[i];
            }
        }
    } 
    return max;
}

int main()
{
    int t=0,num=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sign[a[i]]++;
    }
    for(int i=0;i<1000;i++)
    {
        if(sign[i]==0)
        {
            continue;
        }
         else
         {
             num++;
         }
    }
    for(int i=0;i<num;i++)
    {
        t=findmax();
        cout<<t<<" "<<sign[t]<<endl;
        sign[t]=0;
    }
} 
如果我的回答对你有帮助,请点击旁边的采纳按钮,谢谢

你这可能是思路没问题,写代码的时候糊涂了

因为这个代码写到后面意思就不对了


思路应该是这样的:

1.将所有数字排序

for(i=1;i<n;i++){
        for(j=i;j>0&&array[j]<array[j-1];j--){
            temp=array[j];
            array[j]=array[j-1];
            array[j-1]=temp;
        }
    }


2.统计次数

result[0][0]=array[0];
    result[0][1]=1;
    count=0; 
    for(i=1;i<n;i++){
        if(array[i]==result[count][0]){
            result[count][1]++;
        }else{
            count++;
            result[count][0]=array[i];
            result[count][1]=1;
        }
    }


3.对次数进行排序

    for(i=1;i<=count;i++){
        for(j=i;j>0&&result[j][1]>result[j-1][1];j--){
            temp=result[j][0];
            result[j][0]=result[j-1][0];
            result[j-1][0]=temp;
            
            temp=result[j][1];
            result[j][1]=result[j-1][1];
            result[j-1][1]=temp;
        }
    }


具体代码如下:

/*
问题描述 
 给定 n 个整数,请统计出每个整数出现的次数,按出现次数从多到少
的顺序输出。
输入格式 
 输入的第一行包含一个整数 n,表示给定数字的个数。
 第二行包含 n 个整数,相邻的整数之间用一个空格分隔,表示所给定
的整数。
输出格式 
 输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的
次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则
先输出值较小的,然后输出值较大的。(1 ≤ 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(void){
    int n;
    int i,j,temp,count;
    printf("请输入数字个数:");
    scanf("%d",&n);
    int array[n];
    int result[n][2];
    //输入数据 
    printf("请输入数据:");
    for(i=0;i<n;i++){
        scanf("%d",&array[i]);
    }
    //对数字排序
    for(i=1;i<n;i++){
        for(j=i;j>0&&array[j]<array[j-1];j--){
            temp=array[j];
            array[j]=array[j-1];
            array[j-1]=temp;
        }
    }
    //统计次数
    result[0][0]=array[0];
    result[0][1]=1;
    count=0; 
    for(i=1;i<n;i++){
        if(array[i]==result[count][0]){
            result[count][1]++;
        }else{
            count++;
            result[count][0]=array[i];
            result[count][1]=1;
        }
    }
    //对次数进行排序
    for(i=1;i<=count;i++){
        for(j=i;j>0&&result[j][1]>result[j-1][1];j--){
            temp=result[j][0];
            result[j][0]=result[j-1][0];
            result[j-1][0]=temp;
            
            temp=result[j][1];
            result[j][1]=result[j-1][1];
            result[j-1][1]=temp;
        }
    } 
    //输出
    for(i=0;i<=count;i++){
        printf("%d\t%d\n",result[i][0],result[i][1]);
    } 
    return 0;
}


建议用结构体的桶存储每个数的值和它出现的次数,然后手打cmp函数:

#include<bits/stdc++.h>
using namespace std;
int n,a[1000],t;
struct node{
    int a,b;
}sign[1001];
bool cmp(node a,node b){
    if(a.b==b.b)
        return a.a<b.a;
    return a.b>b.b;
}
int main(){
    cin>>n;
    for(int i=1;i<=1000;i++)
        sign[i].a=i;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sign[a[i]].b++;
    }
    sort(sign,sign+1001,cmp);
    for(int i=0;i<=1001&&sign[i].b;i++)
        cout<<sign[i].a<<' '<<sign[i].b<<endl;
    return 0;
}

各位大佬能看看我的代码是为什么不合适呀?我想知道自己错哪了😂