对数组A中的N(0<N<100)个整数从小到大进行连续编号

我只能考虑不相等的情况,比如输入 98 23 23 23,答案应该输出的应该是2 1 1 1,但我的输出是4 1 1 1,怎么破,怎么修改我的代码,要考虑到两个或多个数相等的情况?

需要用2个二外的数组进行存储,这样就可以在O(n)的时间复杂度下完成计算。具体过程如下:

#include<stdio.h>
#define N 100
int main()
{
    int a[N], temp1[N] = { 0 }, temp2[N] = { 0 }, c[N];
    int n = 0,count=0;
    printf("please input n integers: \n");
    for (int i = 0;; i++)
    {
        scanf_s("%d", &a[i]);
        n++;
        if (getchar() == '\n')
        break;
    }
    count = n;
 
    n = 1;
    for (int i = 0; i < count; i++)
        temp1[a[i]]++;
    for (int i = 0; i < N; i++)
        if (temp1[i] != 0)
            temp2[i] = n++;
    for (int i = 0; i < count; i++)
        c[i] = temp2[a[i]];
    for (int i = 0; i < count; i++)
        printf("%d ", c[i]);
    printf("\n");
    return 0;
}

 

结果如下:

追问

在我的基础上可以改吗

追答

判断重复数不是很好判断,除非再弄一个数组,把原数组中重复的数字合并处理。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-17
#include <stdio.h>

const int MAXSIZE = 100;

void sort(int a[],int n) {
int i,j,k,t;
for(i = 0; i < n - 1; ++i) {
k = i;
for(j = i + 1; j < n; ++j) {
if(a[k] > a[j]) k = j;
}
if(k != i) {
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}

int main() {
int a[MAXSIZE],i,k,n = 0;
printf("输入整数:");
while(scanf("%d",&a[n]) == 1 && n < MAXSIZE) {
printf("输入整数(q to quit):");
++n;
}
sort(a,n);
printf("1 ");
k = 1;
for(i = n - 2; i >= 0; --i) {
if(a[i] != a[i + 1]) ++k;
printf("%d ",k);
}
printf("\n");
return 0;
}

追问

初学者,看不懂啊。。。

第2个回答  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]);
}
相似回答