C에서 원래 위치를 유지하면서 데이터 정렬
C에서는 원래 위치를 유지하면서 요소 모음을 정렬해야 하는 경우가 많습니다. . 이는 외부 요인이 이러한 위치에 따라 달라질 때 매우 중요합니다.
샘플 세트 A = [5, 2, 1, 4, 3]을 고려하세요. 표준 정렬 기능을 사용하여 이 세트를 정렬하면 B = [1,2,3,4,5]가 생성됩니다. 그러나 우리는 또한 정렬된 요소의 원래 인덱스를 추적하여 원래 A 내의 B에 있는 각 요소의 인덱스를 나타내는 집합 C = [2, 1, 4, 3, 0]을 생성하려고 합니다.
C 11 람다를 사용한 솔루션
C 11 람다를 사용하면 이 문제를 편리하게 해결할 수 있습니다. 문제:
#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!