首页 >后端开发 >C++ >如何在保持原始索引的情况下对C中的数据进行排序?

如何在保持原始索引的情况下对C中的数据进行排序?

Barbara Streisand
Barbara Streisand原创
2024-12-21 16:28:09480浏览

How Can I Sort Data in C   While Maintaining Original Indices?

在 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> &amp;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(),
       [&amp;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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn