c / c ++中的可逆浮点排序

时间:2010-06-29 15:01:32

标签: c++ c sorting

我需要对一些浮点数组进行排序,修改值,然后使用原始排序构造一个数组,但是修改后的值。

在R中,我可以使用rank()order()函数来实现此目的:
v向量
v[order(v)]已排序 v[i]位于排序向量中的rank(v)

标准c或c ++库中是否有一些等效的函数?置换矩阵或编码相同信息的其他方式也可以 O(n)空间和O(nlogn)时间是理想的。

4 个答案:

答案 0 :(得分:2)

相当于C ++中的rank函数:它被称为nth_element,可以应用于Random Access Container的任何模型(其中vector和{{1}很突出)。

现在,对我来说,问题似乎是对值的操作可能实际上会修改值,因此排名会发生变化。因此,我建议存储队列。

  1. dequestd::vector<float>
  2. 排序std::vector< std::pair<float, rank_t> >(无任何谓词)
  3. 操作值
  4. vectorstd::vector< std::pair<float, rank_t> >
  5. 除非您希望std::vector<float>受到当前对所发生值的修改的影响。

答案 1 :(得分:1)

答案不是对浮点数进行排序,而是创建一个指向浮点数的指针数组,并使用比较函数对指针数组进行排序,该函数取消引用指针并比较它们指向的浮点数。

答案 2 :(得分:0)

http://www.cplusplus.com/reference/algorithm/sort/

你可以将你的浮动填充到一个也包含int的结构中,构建这些结构的数组并将每个元素的位置存储在int字段中。使用带有比较函数的stl sort,该函数在第一步的float字段上运行,执行计算,然后使用对int字段进行操作的compare函数进行排序以恢复原始订单。

可能有更好的方法来做到这一点,我不是一个真正的c ++人

答案 3 :(得分:0)

简单的答案是在排序之前复制数组,并在完成后恢复它们。如果速度是一个问题,只能做一些更复杂的事情。

在C ++中,您可以使用自定义比较器对索引数组进行排序,以比较数组值,这类似的东西(未经过测试,并假设浮点数位于向量中):

class Comparator
{
public:
    explicit Comparator(const std::vector<float>& array) : array(array) {}
    bool operator()(size_t a, size_t b) {return array[a] < array[b];}
private:
    const std::vector<float>& array;
};

void Example(const std::vector<float> &floats)
{
    std::vector<size_t> rank;
    for (int i = 0; i < floats.size(); ++i) rank.push_back(i);
    std::sort(rank.begin(), rank.end(), Comparator(floats));

    std::cout << "First: " << floats[rank.front()] << std::endl;
    std::cout << "Last:  " << floats[rank.back()]  << std::endl;
}

或者,以额外内存为代价,您可以构建(浮点,等级)对的向量,并根据浮点值对其进行排序。这种方法也可以在C中使用qsort()