【问题标题】:C#: Merge sort with Vectors [closed]C#:使用向量合并排序[关闭]
【发布时间】: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) &lt;= GetEucledianDistance(right.First(), main)) ...
  • 不清楚这里的排序键是什么。确实(正如之前的 cmets 猜测的那样)所有项目都根据它们与单个位置的距离进行排序吗?如果是这样,您将需要传递该单个位置,以便可以使用该位置调用 GetEuclideanDistance() 方法。如果不是,那么您需要解释您正在尝试排序的内容。如果没有一个好的minimal reproducible example,就不可能确定这里的意图是什么,更不用说如何帮助您解决问题了。

标签: c# sorting merge


【解决方案1】:

如果我对您的理解正确,您想要实现的是CollectionVector2 坐标,按它们相对于house 坐标的欧几里得距离排序。 如果是这样,那就足够了:

//Coordinates - coordinates list to sort
//housePosition - position to which Euclidean distance should be calculated for every coordinate
private static List<Vector2> SortByDistance(IEnumerable<Vector2> coordinates, Vector2 housePosition)
{
    return coordinates.OrderBy(coordinate => GetEuclideanDistance(coordinate, housePosition)).ToList();
}


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;
}

【讨论】:

  • +1 但您可能猜错了。最好让这些不清楚的问题通过并关闭它们(一旦你联系到代表这样做)。
  • 因为您只是比较一个相对于另一个的距离,您可以使用一个不使用平方根部分的专用函数来加快速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2017-10-13
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多