ホームページ >バックエンド開発 >C++ >C でデータを並べ替えるときに元のインデックスを保持するにはどうすればよいですか?

C でデータを並べ替えるときに元のインデックスを保持するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-30 18:37:09406ブラウズ

How Can I Preserve Original Indexes When Sorting Data in C  ?

C ソート中の元のインデックスの保持

元のインデックスを保持しながらデータをソートすることは、データ操作タスクの一般的な要件です。 C では、標準ライブラリを使用して、このタスクには次の手順が含まれます:

  1. ベクトルの初期化: 元のデータ値とそれに対応するインデックスを格納するベクトルを作成し、適切な値で初期化します。
  2. インデックスを保持した並べ替え: のような標準アルゴリズムを利用します。 std::stable_sort は、元のベクトル インデックスと並べ替えられたベクトル インデックス間の相関関係を維持しながら、値によってデータを配置します。
  3. 並べ替えられたインデックスを返す: 並べ替えられたインデックスを含むベクトルを抽出して返します。元の要素の順序。
  4. アプリケーション例: ソートされたインデックスを後続の要素で使用する元のベクトルから変更された順序でデータを取得する反復。

C 11 での実装:

#include <iostream>
#include <vector>
#include <numeric>      // std::iota
#include <algorithm>    // std::sort, std::stable_sort

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
  // Using std::stable_sort instead of std::sort
  // to avoid unnecessary index re-orderings
  // when v contains elements of equal values 
  stable_sort(idx.begin(), idx.end(),
       [&v](size_t i1, size_t i2) {return v[i1] < v[i2];});

  return idx;
}

使用例:

vector<double> values = {5, 2, 1, 4, 3};
vector<size_t> sorted_indexes = sort_indexes(values);

for (auto i : sorted_indexes) {
  cout << values[i] << endl;
}

以上がC でデータを並べ替えるときに元のインデックスを保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。