我们在处理数组问题时,如需要求逆序数,然而数据给的又特别大,此时我们就可以用数组的离散处理来解决了。
当数的范围比较大时需要进行离散化,即先排个序,再重新编号。如a[] = {10000000, 10, 2000, 20, 300},那么离散化后a[] = {5,
1, 4, 2, 3}。
附上代码:
#include<cstdio>
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=500000+1000;
int c[MAXN];
struct node
{
int v;
int index;
bool operator <(const node& b)const
{
return v<b.v;
}
}nodes[MAXN];
int b[MAXN];//将初始数组重新赋值后 相对大小不变的新数组
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&nodes[i].v);
nodes[i].index=i;
}
sort(nodes+1,nodes+n+1);
memset(b,0,sizeof(b));
b[nodes[1].index]=1;
for(int i=2;i<=n;i++)
{
if(nodes[i].v==nodes[i-1].v)
b[ nodes[i].index ]=b[ nodes[i-1].index ];
else
b[ nodes[i].index ]=i;
}
for(int i=1;i<=n;i++)
cout<<b[i]<<endl;
}
数据测试结果:
下面在介绍一种更简单的用STL来处理的离散化,这里要运用到lower_bound()函数,
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=15;
int main()
{
int n,i;
int a[maxn],b[maxn],c[maxn];
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+n);
for(i=1;i<=n;i++)
{
c[i]=lower_bound(b+1,b+n+1,a[i])-b;
}
for(i=1;i<=n;i++)
cout<<c[i]<<endl;
system("pause");
return 0;
}