📜  对以 K 为模产生 P 的数组元素排序(1)

📅  最后修改于: 2023-12-03 15:09:28.426000             🧑  作者: Mango

对以 K 为模产生 P 的数组元素排序

在对数组进行排序时,我们常常需要一个关键字来进行排序,比如数字大小、字符串字典序等等。而有些场合,我们需要对数组进行特殊的排序,如对以 K 为模产生 P 的数组元素排序。这时我们需要写一个函数来实现这个功能。

实现思路

对于每个元素 arr[i],我们可以先求它对 K 取模的余数,然后将余数与元素值一起存入一个 pair 中,再将所有的 pair 存入一个数组中。最后对于这个数组进行排序,排序方式为按对 K 取模的余数从小到大排序。排序后,我们就可以得到一个按以 K 为模产生 P 的方式排列的数组了。

代码实现

以下为该函数的代码实现,使用 C++ 编写。

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

using namespace std;

typedef pair<int, int> pii;

bool cmp(const pii& a, const pii& b) {
    return a.first < b.first;
}

vector<int> sort_by_mode(int K, int P, vector<int>& arr) {
    vector<pii> v(arr.size());
    for (int i = 0; i < arr.size(); i++) {
        v[i].first = arr[i] % K;
        v[i].second = arr[i];
    }

    sort(v.begin(), v.end(), cmp);

    vector<int> res;
    for (int i = 0; i < arr.size(); i++) {
        int num = v[i].second;
        if (num % K == P) {
            res.push_back(num);
        }
    }

    return res;
}

int main() {
    vector<int> arr = {3, 6, 9, 12, 15};
    int K = 6, P = 0;

    vector<int> res = sort_by_mode(K, P, arr);

    cout << "Input array: ";
    for (int num : arr) {
        cout << num << " ";
    }
    cout << endl;

    cout << "Sorted array by mode " << K << ": ";
    for (int num : res) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}
函数说明

该函数的参数为三个:K、P 和 arr。K 和 P 都是整数,用于定义以 K 为模产生 P 的方式;arr 是一个整型数组,需要进行排序。函数返回一个整型数组,为按以 K 为模产生 P 的方式排列的 arr。

示例

假设 arr = [3, 6, 9, 12, 15],K = 6,P = 0。我们调用函数 sort_by_mode(K, P, arr),可以得到按以 K 为模产生 P 的方式排列的 arr,即 [6, 12]。

此处给出一个具体执行该函数的程序截图:

sort_by_mode_demo.png