我需要对一些浮点数组进行排序,修改值,然后使用原始排序构造一个数组,但是修改后的值。
在R中,我可以使用rank()
和order()
函数来实现此目的:
v
向量
v[order(v)]
已排序
v[i]
位于排序向量中的rank(v)
点
标准c或c ++库中是否有一些等效的函数?置换矩阵或编码相同信息的其他方式也可以 O(n)空间和O(nlogn)时间是理想的。
答案 0 :(得分:2)
相当于C ++中的rank
函数:它被称为nth_element,可以应用于Random Access Container的任何模型(其中vector
和{{1}很突出)。
现在,对我来说,问题似乎是对值的操作可能实际上会修改值,因此排名会发生变化。因此,我建议存储队列。
deque
至std::vector<float>
std::vector< std::pair<float, rank_t> >
(无任何谓词)vector
至std::vector< std::pair<float, rank_t> >
除非您希望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()
。