Euclidean Distance ile koordinatlarına dayanarak evlerin listesini sıralamak için gereken bir program yazıyorum. Listeyi sıralamak için birleştirme sıralama algoritmasını kullanıyorum.C#: Vektörlerle birleştirme sıralama
Vector2 koordinatları: binaların koordinatları. Vector2 evi: Ana binanın koordinatları.
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;
}
}
}
çift yıldız işareti ile satırda: Aşağıda
birleştirme tür yapar sınıftır() < = right.First() left.First. GetEuclideanDistance() yönteminin gelmesi gerekiyor, bence ama nasıl yapmıyorum?Aşağıdaki gibi bir şey denedim: GetEuclideanDistance (soldaki listedeki ilk öğe) < = GetEuclideanDistance (doğru listedeki ilk öğenin). Ama sonra ne tür parametreler vermem gerektiğini bilmiyorum.
Bir karşılaştırıcı uygulanması ve çekirdek nasıl sıralamak karar izin yok değil mi bir sebep var mı? –
Onları ana binaya olan mesafeye göre sınıflandırmak ister misiniz? O zaman ilk önce ana yapıyı nasıl tanımlayacaksınız. Vector2 main = yeni Vector2 (bazı koordinatlar). Daha sonra karşılaştırabilirsiniz: Eğer (GetEucledianDistance (left.First(), main) <= GetEucledianDistance (right.First(), main)) ... ' – derpirscher
Bu sıralama anahtarının ne olduğu açık değil. Gerçekten de (önceki yorumların tahmin ettiği gibi) tüm öğelerin tek bir yerden uzaklıklarına göre sıralandığı mı? Eğer öyleyse, o tek konumdan geçmek gerekir, böylece GetEuclideanDistance() yöntemi bu konumla çağrılabilir. Eğer değilse, o zaman ne sıralamaya çalıştığınızı açıklamanız gerekir. İyi bir [mcve] olmadan, niyetin ne olduğunu tam olarak bilmek imkansızdır, probleminize nasıl yardımcı olabileceğinizi asla unutmayın. –