对数组a中的n(0<n<100)个整数从小到大进行连续

希望名位高手们给点指点,这个我想了好久还是运行不了的,多谢啦 对数组a中的n(0<n<100)个整数从小到大进行连续编号,要求不能改变数组a中元素的顺序,且相同的整数大小的编号相同,例如:a={5,3,4,7,3,5,6} 则输出结果:{3,1,2,5,1,3,4}.

思路:
step1:
先将输入后的a数组复制到b数组中去
step2:
对b数组元素用起泡法由小到大排序
step3:
元素b[0]的大小标号为1,比较b[j+1]和b[j]的大小,如果b[j+1]>b[j],则标号大小
+1,如果b[j+1]==b[j],则标号不变,b[j]的标号放在数组b1中,由b1[j]记录元素
b[j]标号大小。
for(j=0;j<n-1;j++) //对排序后的b数组元素进行标记
{
if(b[j+1]>b[j]) b1[j+1]=b1[j]+1;
if(b[j+1]==b[j]) b1[j+1]=b1[j];
}
step4:
对数组a中元素进行标号时,可借用数组b中元素的标号。具体为:a[0]的标记:先找
到和a[0]相同的b[j](0<=j<n),把b[j]的标号b1[j],给元素a[0]作为标号a1[0]。同理a[1]的标记
也是如此。
for(i=0;i<n;i++)//对a数组元素进行标记
for(j=0;j<n;j++)
if(a[i]==b[j]) a1[i]=b1[j];
程序如下
#include<stdio.h>
main()
{
int i,j,k,n,t,a[102],b[102],a1[102],b1[102];
b1[0]=1;//编号从 1开始.数组a,b 中元素对应的下标 分别放在a1和b1中
printf("输入n\n");
scanf("%d",&n);
printf("输入%d个数\n",n);
for(k=0,i=0;k<n;k++,i++)
{
scanf("%d",a+k);b[i]=a[k];//保存到数组a中,复制到数组b中
}
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
{
if(b[j]>b[j+1])
{t=b[j+1];b[j+1]=b[j];b[j]=t;}//起泡法对数组b元素排序
}
for(j=0;j<n-1;j++) //对排序后的b数组元素进行标记
{
if(b[j+1]>b[j]) b1[j+1]=b1[j]+1;
if(b[j+1]==b[j]) b1[j+1]=b1[j];
}
for(i=0;i<n;i++)//对a数组元素进行标记
for(j=0;j<n;j++)
if(a[i]==b[j]) a1[i]=b1[j];
for(i=0;i<n;i++)
printf("%d\t",a1[i]);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-04-08
main()
{
int a[7]={5,3,4,7,3,5,6},b[7]={0};
int i,j,n;
/*把A中的数去掉重复的放入B中*/
b[n++]=a[0];
for(i=1;i<7;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
break;
}
if(j==n)
{
b[n++]=a[i];
}
}

/*把B中的排序*/
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(b[i]<b[j])
{
int t; t=b[i];b[i]=b[j];b[j]=t;
}
}
/*在B中找A中每个数对应的下标*/
for(i=0;i<7;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
printf("%d,",j+1);
}
}

}本回答被提问者采纳
相似回答