

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
/**********************************/
//1
//7
//3 2 3 8 8 2 3
//1 2 3 2 1 3 1
//3 8 3 2 8 3 2
//1 1 1 2 2 3 3
//1={2=0,3=2,8=1}
//2={2=1,3=0,8=1}
//3={2=1,3=1,8=0}
/**********************************/
//建立一个数组,保持这个数组的唯一性。
//1.根据第二个数组对A中的数组进行划分
//2.根据划分好的数组分别排序进行数据统计
typedef struct Sat
{
int data;
int group;
}Sat;
void ResortSat(Sat N[],int n)
{
int v,m;
int i,j;
for(i=0;i<n;i++)
{
v=N[i].group;//后面的元素,准备新加入的元素。
m=N[i].data;
j=i-1; //前面的元素。
while(j>=0&&N[j].group>v)//前面的元素比新加入的元素大
{
N[j+1].data=N[j].data; //前面的元素后移一位。把相应的N[j]放到N[j+1]的位置。
N[j+1].group=N[j].group; //结构体在进行值修改的时候,要把包含的项目都相应挪动。
j--; //j-- j继续指向前一个位置元素
}
N[j+1].group=v; //跳出循环只有两个可能,第一种情况j小于0了,意味着当前i元素是最小的,放在第一个位置。
N[j+1].data=m; //第二种情况,就是前面j个元素没有比i位置元素小的了,那么第j+1即是i元素的位置了。
}
}
//3 8 3 2 8 3 2
//1 1 1 2 2 3 3
//用来记录一组数中有多少种类的数,组内去重
int Takenote(Sat N[],int B[],int c[],int n)
{
int m;
int i,j;
for(i=0;i<n;i++)
{
B[i]=N[i].data;
}
for(i=0;i<n;i++)
{
m=B[i];
j=i-1;
while(j>=0&&B[j]>m)
{
B[j+1]=B[j];
j--;
}
B[j+1]=m;
}
int len=0;
int flag[1000]={0};
for(i=0;i<n;i++)
{
if(flag[B[i]]==0)
{
c[len++]=B[i];
flag[B[i]] = 1;
}
}
for(i=0;i<len;i++)
{
printf("%d ",c[i]);
}
return len;
}
//3 8 3 2 8 3 2
//1 1 1 2 2 3 3
//2 3 8
void GroupcountSat1(Sat N[],int c[],int length,int n)
{
int i,k,s;
int A[100]={0};
memset(A,0,sizeof(A));
for(i=0; i<n; i++)
{
printf("%d={",N[i].group);
A[N[i].data]=1;
for(s=i+1;s<=n;s++) //两层循环为了对比前一元素组别和后一元素组别一致。
{
if(N[i].group==N[s].group) //组别相同
{
if(!A[N[s].data]) //检查数组A中这个值的位置是否为空,如果为空,变成1
{
A[N[s].data]=1;
}
else
{
A[N[s].data]+=1; //如果不为空,当前位置+1。
}
}
else //如果后面组别不相等了,那么第一组结束,先输出第一组。
{
for(k=0; k<length; k++) //把C中元素拿出来做对比
{
if(A[c[k]]!=0)
{
printf("%d=%d",c[k],A[c[k]]);
}
else
{
printf("%d=0",c[k]);
}
if(k!=length-1)
{
printf(",");
}
}
printf("}\n");
memset(A,0,sizeof(A)); //一组比对结束,A数组重新初始化。
i=s-1;
break;
}
}
}
}
void Print(Sat N[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",N[i].data);
}
printf("\n");
for( i=0;i<n;i++)
{
printf("%d ",N[i].group);
}
}
int main()
{
int m,n;
cin>>m>>n;
Sat N[n];
int B[n];
int c[n];
int i,j;
int length;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&N[j].data);
}
for(j=0; j<n; j++)
{
scanf("%d",&N[j].group);
}
ResortSat(N,n); //对输入数据进行排序
Print(N,n);
printf("\n");
length=Takenote(N,B,c,n); //用来计算输入数据元素的唯一性
printf("\n");
GroupcountSat1(N,c,length,n);
}
return 0;
}

注:此题虽然运行出来结果,但在牛客上提交不通过,还在找问题。。 ̄□ ̄||
本文介绍了一个使用C++实现的数组排序和数据统计算法。该算法首先对输入的数据进行排序,然后去除重复项并统计每组数据的频率。通过实例演示了如何对数组进行分组,并对每组内的数据进行统计。
1万+

被折叠的 条评论
为什么被折叠?



