题目描述
对数组A中的N(0<N<100)个整数从小到大进行连续编号,要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如:
A=(5,3,4,7,3,5,6)
则输出为: (3,1,2,5,1,3,4)
难点分析
- 对数组中每一个数字进行合理的排序
- 数组中有重复的数字、需要留意!
思路1:暴力破解
应题目要求(不能改变数组A中元素的顺序),建立一个新的数组b[],对数组b[]中的元素进行排序,后删去数组b[]中重复的数字。最后,对照数组A[]中的数字进行输出
#include<iostream>
#include<ctime>
using namespace std;
const int N=10;
int a[N];//存放原来数据
int b[N];//用于操作
int n=N;
int main()
{
srand(time(0)); //随机数种子
for (int i = 0; i < 10; i++)
{//生成随机数组
a[i] = rand() % 10;
cout<<a[i]<<" ";
}
cout<<endl;
int k=0;
//对数组b进行赋值
for(int i=0;i<n;i++){
b[i]=a[i];
}
//对数组b进行排序
//冒泡排序 这里也可以用sort()函数
for (int i = 0; i < n - 1; i++)
{
int j = 0;
for (j = 0; j < n - 1 - i; j++)
{
if (b[j] > b[j + 1])
{
int tmp = b[j];
b[j] = b[j + 1];
b[j + 1] = tmp;
}
}
}
//去重
for (int i = 0; i < n - 1; i++)
{
if (b[i] == b[i + 1])
{
int k = 0;
for (k = i; k < n - 1; k++)
{
b[k] = b[k + 1];
}
n--; //缩小b数组长度
i--;
}
}
//对比输出
for(int i=0;i<N;i++)
{
for(int j=0;j<n;j++)
{
if(a[i]==b[j]) printf("%d ",j+1);
}
}
return 0;
}
思路2:运用“桶”
对数组A[]中的每一个数数字均记录出现次数,用数组t[]存储(也即是桶排序)。由于不能改变数组A的数字顺序,所以新建数组b[]。数组b[]用来存储输出的结果且初始值为1。
两层循环,将数组A[i]中的数字一一拿出来与桶的各个下标 j 作比较,若大于该下标,则数组b[i]+=t[j]。
#include<iostream>
#include<ctime>
using namespace std;
int a[10], t[100], b[10];
int main()
{
srand(time(0)); //随机数种子
for (int i = 0; i < 10; i++)
{//生成随机数组
a[i] = rand() % 10;
t[a[i]] = 1;
b[i] = 1;
cout<<a[i]<<" ";
}
cout<<endl;
for (int i = 0; i < 10; i++)
for (int j = 0; j < 100; j++)
if (j < a[i])
b[i] += t[j];
for (int i = 0; i < 10; i++)
cout<<b[i]<<" ";
return 0;
}