坐标的排序
Ordering of coordinates
假设我有n
点
(x,y1),(x2,y2),.....(xn,yn)
我的目标是以这样一种方式连接这些点,使我得到一个没有自相交的样条曲线。我的方法是通过增加x值的顺序来对这些元素进行排序,如果它们相等,则比较y值。这是我的方法:
#include<iostream>
#include<ctime>
using namespace std;
#define N 1000
struct Point
{
int x;
int y;
}point[N];
int main()
{
int start=clock();
int n;
cout<<" enter number of coordinantes " <<endl;
cin>>n;
for(int i=1;i<=n;i++)
cin>>point[i].x>>point[i].y;
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++)
{
if(point[i].x>point[j].x)
{
int t=point[i].x;
point[i].x=point[j].x;
point[j].x=t;
}
if( point[i].x==point[j].x)
{
if(point[i].y>point[j].y)
{
int s=point[i].y;
point[i].y=point[j].y;
point[j].y=s;
}
}
}
}
int end=clock();
cout<<"coordinantes are :"<<endl;
for(int i=1;i<=n;i++)
cout<<point[i].x<<" "<<point[i].y<<endl;
cout<<(end-start)/(float)CLOCKS_PER_SEC<<endl;
return 0;
}
当我输入一个等于20的元素数时,花费了102.59毫秒(2.5 RAM的笔记本电脑,1.87 GH)。我的方法是最优的还是存在更好的方法?
算法中的瓶颈是排序,即O(n^2)
。它可以在O(nlogn)
-中完成,这是渐进的好得多。
您应该首先使用更快的排序对数据进行排序,然后调用算法的第二阶段对元素进行迭代。
还要注意的是,有计划地说-通常在程序的各个部分之间分离是一种很好的做法,在您的情况下,在排序和后续遍历之间分离。
对于排序,您可能希望了解std::sort()
,并且可能希望熟悉快速排序
如果您关心性能,我会指出以下几点:
1) 你正在使用1000个元素——内存浪费。使用*point&对所需数量的元素执行malloc
。
2) 您在当前实现中没有使用点[0]-内存浪费!;-)
3) 正如其他人所说,您的排序算法不是最佳选择。
当我输入元素20的数字时,花费了102.59毫秒(笔记本电脑具有2.5 RAM,1.87 GH),因此这是的最佳方式
处理20个元素并不能说明算法的效率。样本需要足够大,以便对程序进行合理的基准测试。
继续排序,您可以根据自己的比较标准进行排序。
boolean compare(Point A, Point B) {
return ((A.x > B.x)||((A.x==B.x)&&(A.y>B.y)));
}
(为语法道歉…我的C++生疏了)
然后使用std::sort等实现良好的算法和此函数作为比较顺序来执行排序。
相关文章:
- 二叉排序树无法编译
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 使用C++中的链表对与原点的距离、x 和 y 坐标进行排序
- 对坐标结构的向量进行排序
- 如何按坐标 x 或坐标 y 对 QGraphicsitem 的 QList 进行排序
- 在 c++ 中对插值的坐标进行排序和搜索
- 对坐标 c++ 的向量进行排序
- 根据点的坐标对点进行排序
- 如何按距点的距离(x1,y1)升序对一组坐标进行排序
- 对抛物线的坐标 (x,y) 进行排序 y=ax^2+bx+c x=x1,x2,x3, x4.根据 y 坐标
- 坐标的排序向量C++
- C++对指针向量进行排序,其中对象表示矩阵坐标
- 坐标的排序
- Make_heap和排序x和y坐标
- 基于 x 和 y 坐标进行排序
- 排序坐标从左上到右下
- 以蛇形图案排序点坐标
- 如何使用std::sort按x坐标对结构进行排序
- 排序屏幕坐标