2016-04-02 23 views
0

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.

+0

Bir karşılaştırıcı uygulanması ve çekirdek nasıl sıralamak karar izin yok değil mi bir sebep var mı? –

+1

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

+0

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. –

cevap

1

Sizi doğru anladıysam, elde etmek istediğiniz şey, house koordinatlarıyla ilişkili olarak Öklid Mesafesi tarafından sıralanan Vector2 koordinatlarının Collection koordinatlarıdır. Eğer öyleyse, o yeterli olmalıdır:

//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; 
} 
+0

+1 ancak yanlış tahmin ettiniz. Bu açık olmayan soruların geçmesine ve kapatmasına izin vermek en iyisidir (bunu yapmak için temsilciye ulaşır ulaşmaz). – usr

+0

Sadece bir mesafeyi diğerine göre görüyorsanız, bunu kare kök kısmından ayıran özel bir işlevle hızlandırabilirsiniz. –