一、问题
【问题描述】
给一个整型数组中的数按从小到大连续编号,要求相同数字编号相同,编号从1开始,输出编号结果时按照原数组元素的顺序输出。
【输入形式】
从控制台输入数据,第一行输入数组元素个数(个数大于等于1,并且小于等于20),第二行输入整型数组元素,各个整数之间以空格分隔。
【输出形式】
在屏幕上输出编号结果,各个编号之间用一个空格分隔。
【样例】
7↲
-3 75 51 90 1118 51 -3↲
1 3 2 4 5 2 1
共输入了7个整数,分别为:-3 75 51 90 1118 51 -3,其编号分别为1 3 2 4 5 2 1,其中有两个-3和51,它们的编号相同。
二、思路
1、输入数据
2、升序排序
3、去重
4、编号
5、输出
6、测试
Ⅰ
7↲
-3 75 51 90 1118 51 -3↲
1 3 2 4 5 2 1
Ⅱ
6↲
0 0 0 0 0 0↲
1 1 1 1 1 1
Ⅲ
20↲
23 23 -45 -23 0 0 23 56 -12 4657 -45 -23 23 245 12 3 6 22 4 56↲
10 10 1 2 4 4 10 11 3 13 1 2 10 12 8 5 7 9 6 11
三、源码
#include <stdio.h>
#define N 20
int main()
{
int n, dc = 0; // 输入个数, 删除计数
int arr[N] = {0}; // 原始数组
int sorted[N] = {0}; // 排序后数组
int index[N] = {0}; // 对应位置的编号
int i, j;
// 输入个数
scanf("%d", &n);
// 输入数组
for(i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 复制数组
for(i = 0; i < n; i++) {
sorted[i] = arr[i];
}
// 升序排序(冒泡)
for(i = 0; i < n - 1; i++) {
for(j = i + 1; j < n; j++) {
if(sorted[i] > sorted[j]) {
int t = sorted[i];
sorted[i] = sorted[j], sorted[j] = t;
}
}
}
// 排序后去重
for(i = 1; i < n - dc; i++) {
if(sorted[i] == sorted[i - 1]) {
// 所有后续元素前移, 后 i++ (使下标不变)
for(j = i; j < n - dc - 1; j++) {
sorted[j] = sorted[j + 1];
}
// 移动完毕, i--, dc++
i--, dc++;
// 把最后一位恢复默认值
sorted[n - dc] = 0;
}
}
// 编号 (循环遍历原数组, 标记其顺序)
for(j = 0; j < n - dc; j++) {
// 循环遍历原数组
for(i = 0; i < n; i++) {
// 标记
if(arr[i] == sorted[j]) {
index[i] = j + 1;
}
}
}
// 打印筛选结果
for(i = 0; i < n; i++) {
printf("%d ", index[i]);
}
return 0;
}