我需要编写一个c代码,从最接近的点对随机数的2d点进行排序 因为我需要有一个n * log(n)的时间复杂度,其中n是我们从用户那里获得的点数我想到使用堆排序方法到原点到距离原点最远的点。唯一的问题是通过(x,y和(0,0)之间的距离等式(即sq ^((x ^ 2)+(y ^ 2))找到距离最近的一对,并将此等式实现给我使用的排序方法。只是寻找一些提示或任何建议如何从这里继续,所以我将不胜感激 建议
答案 0 :(得分:1)
任何好的比较排序算法都将在O(n log n)中运行。为了提高效率,您希望比较器尽可能快地运行。一想法:比较x^2+y^2
而不是实际距离。另一个:为每个点计算一次该数量,并将其缓存在点对象或其他地方,而不是重新计算每次比较。
答案 1 :(得分:0)
堆排序解决方案:
1.从原点创建每个点的最大距离堆。
2.如果您正在实现堆数组,那么只需再创建一个包含该点索引的虚拟数组。
3.只应用普通堆排序&当您在索引之间进行交换时,也会在虚拟数组中交换相同的索引。
lets say my input from user is following point
1,0
8,6
4,4
6,0
所以我的距离数组将包含距离
1,10,sqrt(32),6
我的虚拟数组将包含每个点的正常索引
1,2,3,4
现在在装箱后创建一个最大堆
10,6,sqrt(32),1
所以那时你的虚拟阵列看起来像
2,4,3,1
。
现在应用堆排序10将与1以及2将交换
与虚拟阵列中的1交换等等......
通过虚拟数组中的这个,您将获得从原点到最近的点的所有索引点
告诉我是否有任何你不理解的事情。