按递增顺序对2d点进行排序的算法

时间:2018-03-15 23:53:43

标签: arrays algorithm computer-science

我必须为算法编写一个伪代码,该算法对在单位圆内随机分布的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(距离)

有人可以给我一个提示,告诉我如何开始或向我解释我需要经历的基本要点,以便对这个系统进行分类?

2 个答案:

答案 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)