繁体   English   中英

如何根据 C++ 中的给定索引对列表进行就地排序

[英]How to do in-place sorting a list according to a given index in C++

我有一大堆对象(结构)。 它们已被排序并且索引已保存在另一个列表中。 如何根据索引进行就地排序? 例如,

FOO A[5] =[a5,a4,a8,a1,a3]
int idx[5] = [3,0,4,1,2]

预期成绩:

A[5] = [a1,a5,a3,a4,a8]

由于列表 A 非常大,因此需要一种无需额外大缓冲区的就地排序方法。 我怎么能意识到这一点?

谢谢你们。

您正在寻找的内容称为“应用排列”,并且被认为是已解决的问题(幸运的是)。

Raymond 在他的博客上对此进行了有趣的讨论,并给出了一个就地解决方案https://devblogs.microsoft.com/oldnewthing/20170102-00/?p=95095

我冒昧地为 arrays 调整了他的解决方案。 您可以在他的博客中找到处理矢量的原始版本。

#include <iostream>

template<typename T, size_t N>
void apply_permutation(T * v, size_t * indices)
{
    using std::swap; // to permit Koenig lookup
    for (size_t i = 0; i < N; i++) {
        auto current = i;
        while (i != indices[current]) {
            auto next = indices[current];
            swap(v[current], v[next]);
            indices[current] = current;
            current = next;
        }
        indices[current] = current;
    }
}

int main(){
    const int N = 5; 
    std::string data[N] = {"a5","a4","a8","a1","a3"};
    size_t idx[N] = {3,0,4,1,2};
    apply_permutation<std::string,N>(data, idx);

    for(auto & s : data){
        std::cout << s << std::endl;
    }
}

Output:

g++ test2.cpp && ./a.exe
a1
a5
a3
a4
a8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM