用C 语言 对数组A中的N(0<N<L00)个整数从小到大进行连续编号,要求不能改变数组A中元素的顺序

且相同的整数具有相同的编号.例如:
若A 数组为{5,3,4,7,3,5,6} 则输出为: 3,1,2,5,1,3,4

第1个回答  2019-07-15
思路:
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]);
}
第2个回答  2011-04-18
二维数组,第一维表示序号,第二维表示内容,排序后序号变,内容不变,即可实现本回答被提问者采纳
第3个回答  2012-12-03
#include<stdio.h>
#define N 6
main()
{
int a[N],b[N],c[N],i,j,max;
printf("input numbers:\n");
for(i=0;i<N;i++)
{scanf("%d",&a[i]);
b[i]=1;}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(a[j]<a[i])
b[i]++;
for(i=0;i<N;i++)
{for(j=0,max=0;j<N;j++)
if(b[i]>b[j])
{if(b[j]>max)
max=b[j]; }
b[i]=max+1;}
for(i=0;i<N;i++)
printf("%d\t",a[i]);
printf("\n");
for(i=0;i<N;i++)
printf("%d\t",b[i]);
getch();
}