#include <iostream>
#include <algorithm>
using namespace std;
int* a, * d, * c, n,ctop;
//a原数组 d为排序后的数组 c为去重后的数组
int bin_search(int target) {
int l = 1, r = ctop;
while (l < r) {
int mid = l + r >> 1;
if (c[mid] >= target)r = mid;
else l = mid + 1;
}
return l;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
a = new int[n + 5];
d = new int[n + 5];
c = new int[n + 5];
for (int i = 1; i <= n; i++)cin >> a[i], d[i] = a[i];
sort(d + 1, d + 1 + n);
for (int i = 1; i <= n; i++)
if (d[i] != d[i - 1] || i == 1)c[++ctop] = d[i];
for (int i = 1; i <= n; i++) {
int x = bin_search(a[i]);
a[i] = x;
}
for (int i = 1; i <= n; i++)cout << a[i] << ' ';
delete[] a;
delete[] d;
delete[] c;
return 0;
}
关于离散化
就是把大的数据按大小排序后的序号重新赋值,将其映射到一个较小的空间
步骤:
- 排序
- 去重
- 在去重后的数组里确定原数组每个数的位置,那个位置(即下标)就是离散化后的值
说明
排序去重,即保证原数组每个数(这些数可能有重复)在步骤3中能被唯一确定或者方便获取离散化后的值
最后在去重后的数组中二分查询原数组每个数,得到下标,下标即每个数的排名,即离散化后的值。