int n, a[maxn], b[maxn]; //這裏如下標1爲序列的起點,通常狀況下從0開始也能夠 for(int i = 1;i <= n;i++) { scanf("%d", &a[i]); b[i] = a[i];//b是一個臨時數組,用來獲得離散化的映射關係 } //下面使用了STL中的sort(排序),unique(去重),lower_bound(查找)函數 sort(b + 1, b + n + 1);//排序 int size = unique(b + 1, b + 1 + n) - b - 1;//去重,並得到去重後的長度size for(int i = 1;i <= n;i++) { a[i] = lower_bound(b + 1, b + 1 + size, a[i]) - b;//經過二分查找,快速地把元素和映射對應起來 }
第二種方式其實就是排序以後,枚舉着放回原數組算法
用一個結構體存下原數和位置,按照原數排序數組
我結構體裏面寫了個重載,也能夠寫一個比較函數函數
最後離散化後數在rank【 】 裏面spa
#include<algorithm> struct Node { int data , id; bool operator < (const Node &a) const { return data < a.data; } }; Node num[MAXN]; int rank[MAXN] , n; for(int i=1; i<=n; i++) { scanf("%d",&num[i].data); num[i].id = i; } sort(num+1 , num+n+1); for(int i=1; i<=n; i++) rank[num[i].id] = i;