在 C 中对数据进行排序,同时保留原始位置
在 C 中,经常需要对元素集合进行排序,同时保留其原始位置。当外部因素取决于这些位置时,这一点至关重要。
考虑样本集 A = [5, 2, 1, 4, 3]。使用标准排序函数对该集合进行排序将产生 B = [1,2,3,4,5]。然而,我们还想跟踪已排序元素的原始索引,从而得到集合 C = [2, 1, 4, 3, 0],它表示 B 中每个元素在原始 A 中的索引。
使用 C 11 Lambda 的解决方案
C 11 lambda 提供了一种解决此问题的便捷方法问题:
#include <iostream> #include <vector> #include <numeric> #include <algorithm> using namespace std; template <typename T> vector<size_t> sort_indexes(const vector<T> &v) { // Initialize original index locations vector<size_t> idx(v.size()); iota(idx.begin(), idx.end(), 0); // Sort indexes based on comparing values in v stable_sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; }
在此实现中,我们首先使用原始索引创建一个向量 idx。然后,我们使用 stable_sort 对索引进行排序,确保具有相等值的元素保留其相对顺序。生成的向量 idx 包含排序的索引。
用法
要使用此函数,只需传入值向量并迭代排序的索引:
for (auto i: sort_indexes(v)) { cout << v[i] << endl; }
自定义
sort_indexes 函数可以定制以满足您的特定要求。例如,您可以提供自己的原始索引向量,提供自定义排序函数或比较器,或者在排序期间使用附加向量重新排序 v。
以上是如何在保持原始索引的情况下对C中的数据进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!