我必须为算法编写一个伪代码,该算法对在单位圆内随机分布的n个2D点进行排序。我需要根据它们与原点0,0的距离对它们进行排序(通过将Eucledian距离增加到圆的原点)。
所以我认为它们应该是2D数组或Map:
A = {(0.3,0.4),(0.5,0.7),(0.2,0.1),(0.32,0.9)}
所以这里n = 4,我们有4个2D点。
首先我想计算距离原点(0,0)的距离(d = sqrt((A [i] .x)^ 2 +(A [i] .y)^ 2))每个点,创建一个可以使用任何排序算法轻松排序的一维数组,但后来我发现它可以排序但我不能将二维数组排序到最后,因为最后我只知道d(距离)
有人可以给我一个提示,告诉我如何开始或向我解释我需要经历的基本要点,以便对这个系统进行分类?
答案 0 :(得分:1)
这个问题基本上归结为正常的排序问题。您只需要使用适当的比较函数。
例如,在c ++中,您可以通过在结构中存储x和y值然后重载<
运算符来实现此目的。
struct coor
{
float x;
float y;
bool operator < (const coor &lhs)
{
return (x * x + y * y < lhs.x * lhs.x + lhs.y * lhs.y);
}
};
然后std::sort
将处理coor结构的向量。
答案 1 :(得分:0)
在C ++中,您可以将点存储为vector
pairs
。并使用内置sort
函数:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool my_comp(const pair<float, float>& point1, const pair<float, float>& point2)
{
return point1.first*point1.first + point1.second*point1.second < point2.first*point2.first + point2.second*point2.second;
}
int main()
{
vector< pair<float, float> > points;
points.push_back( make_pair(3.1, 4.1) );
points.push_back( make_pair(0.9, 0.8) );
points.push_back( make_pair(1.0, 1.0) );
sort(points.begin(), points.end(), my_comp);
for(int i=0; i<3; i++) {
cout<<points[i].first<<" "<<points[i].second<<endl;
}
return 0;
}
或者,如果你想在python中编程,同样适合这里。使用数组数组并使用内置排序函数:
def my_comp(point1):
return point1[0]*point1[0] + point1[1]*point1[1]
points = [ [3.1, 4.1], [0.9, 0.8], [1.0, 1.0] ]
points.sort(key=my_comp)
print(points)