【发布时间】:2016-07-22 06:57:20
【问题描述】:
我正在编写一个程序,该程序需要根据房屋与欧几里得距离的坐标对房屋列表进行排序。要对列表进行排序,我使用合并排序算法。
Vector2 坐标:是建筑物的坐标。 Vector2 house:是主楼的坐标。
下面是进行归并排序的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
namespace EntryPoint
{
public static class MergeSorter
{
public static void DoMergeSort(this Vector2[] numbers)
{
var sortedNumbers = MergeSort(numbers);
for (int i = 0; i < sortedNumbers.Length; i++)
{
numbers[i] = sortedNumbers[i];
}
}
private static Vector2[] MergeSort(Vector2[] numbers)
{
if (numbers.Length <= 1)
{
return numbers;
}
var left = new List<Vector2>();
var right = new List<Vector2>();
for (int i = 0; i < numbers.Length; i++)
{
if (i % 2 > 0)
{
left.Add(numbers[i]);
}
else
{
right.Add(numbers[i]);
}
}
left = MergeSort(left.ToArray()).ToList();
right = MergeSort(right.ToArray()).ToList();
return Merge(left, right);
}
private static Vector2[] Merge(List<Vector2> left, List<Vector2> right)
{
var result = new List<Vector2>();
while (left.Count > 0 && right.Count > 0)
{
if (**left.First() <= right.First()**)
{
MoveValueToResult(left, result);
}
else
{
MoveValueToResult(right, result);
}
}
while (left.Count > 0)
{
MoveValueToResult(left, result);
}
while (right.Count > 0)
{
MoveValueToResult(right, result);
}
return result.ToArray();
}
private static void MoveValueToResult(List<Vector2> list, List<Vector2> result)
{
result.Add(list.First());
list.RemoveAt(0);
}
private static double GetEuclideanDistance(Vector2 coordinates, Vector2 house)
{
double distance = Math.Sqrt(Math.Pow((house.X - coordinates.X), 2) + Math.Pow((house.Y - coordinates.Y), 2));
return distance;
}
}
}
在带有双星号的那一行:left.First()
我尝试了类似以下的方法:GetEuclideanDistance(左列表中的第一项)
【问题讨论】:
-
您是否有任何理由不实施比较器并让核心决定如何排序?
-
您想根据到主楼的距离对它们进行排序,对吧?然后首先你必须以某种方式定义主建筑。
Vector2 main = new Vector2(some coordinates)。然后你可以比较:if (GetEucledianDistance(left.First(), main) <= GetEucledianDistance(right.First(), main)) ... -
不清楚这里的排序键是什么。确实(正如之前的 cmets 猜测的那样)所有项目都根据它们与单个位置的距离进行排序吗?如果是这样,您将需要传递该单个位置,以便可以使用该位置调用
GetEuclideanDistance()方法。如果不是,那么您需要解释您正在尝试排序的内容。如果没有一个好的minimal reproducible example,就不可能确定这里的意图是什么,更不用说如何帮助您解决问题了。