C++编程求解,离散化排序,关键字排序

C++离散化排序问题,学习了大家的,还是无法AC,求指教!
【题目描述】
输入n,再输入n行,每行2个关键字,按照第一关键字从小到大排序,当第一关键字一样的时候,按照第二关键字从小到大排序
n <= 1000
每个数字在int范围内
【输入样例】
3
1 2
2 2
1 1
【输出样例】
1 1
1 2
2 2


#include <iostream>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<pair<int, int>> data(n);
    for (int i = 0; i < n; i++) {
        cin >> data[i].first >> data[i].second;
    }

    vector<int> keys(n);
    map<int, int> key_map;
    for (int i = 0; i < n; i++) {
        keys[i] = data[i].first;
    }
    sort(keys.begin(), keys.end());
    keys.erase(unique(keys.begin(), keys.end()), keys.end());
    for (int i = 0; i < keys.size(); i++) {
        key_map[keys[i]] = i;
    }
    for (int i = 0; i < n; i++) {
        data[i].first = key_map[data[i].first];
    }

    sort(data.begin(), data.end());

    for (int i = 0; i < n; i++) {
        cout << keys[data[i].first] << " " << data[i].second << endl;
    }

    return 0;
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7519299
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以为您提供离散化排序的解决思路和代码模板,希望能帮到您。

    离散化排序是指将一串离散的数值转换为连续的数值,例如将 {2, 4, 3} 转换为 {1, 3, 2},以便使用排序算法进行排序。主要通过将原始数据映射到新的数据进行排序,最后再将新的数据转化到原始数据。

    下面是C++的离散化排序实现代码及注释:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 10010;
    int n, m, a[maxn], b[maxn];
    
    int find_x(int x) {
        int l = 1, r = m, mid;
        while (l <= r) { // 二分查找
            mid = (l + r) / 2;
            if (b[mid] == x) 
                return mid;
            else if (b[mid] > x)
                r = mid - 1;
            else l = mid + 1;
        }
        return 0; // 找不到返回0
    }
    
    int main() {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            b[i] = a[i]; // 将a[i]存入b[i]中
        }
        sort(b + 1, b + n + 1); // 对b进行排序
        m = unique(b + 1, b + n + 1) - b - 1; // 用unique函数去重,算出新数组长度m
        for (int i = 1; i <= n; i++)
            a[i] = find_x(a[i]); // 在b中查找a[i]对应的下标
        for (int i = 1; i <= n; i++)
            cout << a[i] << " "; // 输出离散化后的结果
        return 0;
    }
    

    当输入 {2, 4, 3} 时,输出 {1, 3, 2}。

    希望以上代码模板能对您有所帮助,如果仍有疑问,欢迎继续追问。