#include #include using namespace std; const int N = 10000000; const int maxs = 10000; int n; /* 6 1 2 3 1 2 3 1 2 1 2 1 2 3 4 4 3 3 2 3 */ unsigned a[N], b[N], res[N], ord[N], cnt[maxs + 1]; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]); memset(cnt, 0, sizeof(cnt)); for (int i = 0; i < n; i++) ++cnt[b[i]]; // ① 利用cnt数组统计数量,个位数桶计数 for (int i = 0; i < maxs; i++) cnt[i + 1] += cnt[i]; //桶计数前缀和 //先--再使用,是因为ord的下标是从0开始的 for (int i = 0; i < n; i++) ord[--cnt[b[i]]] = i; //② 记录初步排序结果,个位数升序排序 memset(cnt, 0, sizeof(cnt)); for (int i = 0; i < n; i++) ++cnt[a[i]]; //③ 利用cnt数组统计数量,十位数桶计数 for (int i = 0; i < maxs; i++) cnt[i + 1] += cnt[i]; //十位数桶计数前缀和 for (int i = n - 1; i >= 0; i--) res[--cnt[a[ord[i]]]] = ord[i]; //④ 记录最终排序结果 for (int i = 0; i < n; i++) printf("%d %d\n", a[res[i]], b[res[i]]); //⑤ return 0; }