Сортировать список числовых кортежей с вложенными циклами..Net 4.0 C # - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть список числовых кортежей, и я хочу отсортировать его по Item1 с вложенными циклами.Я знаю, что могу просто сделать List.Sort ();но я хочу сделать это и для циклов For, чтобы я мог сравнить производительность.Я ценю любую помощь.

        List<Tuple<double, int, int>> FHM = new List<Tuple<double, int, int>>(); 
        FHM.Add(Tuple.Create(2500.00, 1, 5));
        FHM.Add(Tuple.Create(2400.00, 2, 300));    
        FHM.Add(Tuple.Create(2300.00, 4, 10));
        FHM.Add(Tuple.Create(2600.00, 1, 325));

Я попытался реализовать приведенный ниже код, работающий нормально, сортируя список двойников с вложенными циклами for, но я не могу перекодировать его для кортежей ...

List<double> FH = new List<double>() { 2510, 2509, 2501.5, 2501.75 };


        var S1 = Stopwatch.StartNew();
        double temp;
        for (int i = 0; i < FH.Count; i++)
        {
            for (int n = 0; n < i; n++)
            {
                if (FH[n] > FH[i])
                {
                    temp = FH[i];
                    FH[i] = FH[n];
                    FH[n] = temp;
                }
            }
        }
        S1.Stop();
        Console.WriteLine($"S1 Ticks = " + S1.ElapsedTicks);

/ * ElapsedTicks с ForLoop 4000. Принимая во внимание FH.Sort ();16000. Поэтому я ожидаю, что версия ForLoop с Tuples будет работать лучше для коротких списков, над которыми я работаю.* /

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019
        var S2 = Stopwatch.StartNew();

        var temp = Tuple.Create(0.00, 0, 0);

        for (int i = 0; i < FHM.Count; i++)
        {
            for (int n = 0; n < i; n++)
            {
                if (FHM[n].Item1 > FHM[i].Item1)
                {
                    temp = FHM[i];
                    FHM[i] = FHM[n];
                    FHM[n] = temp;
                }
            }
        }

        S2.Stop();
        Console.WriteLine("Ticks S2 ForLoop = " + S2.ElapsedTicks); // 4000 ElapsedTicks

        S2.Reset();
        S2.Start();

        FHM.Sort();

        S2.Stop();
        Console.WriteLine("Ticks S2 List.Sort(); = " + S2.ElapsedTicks); // 700000 ElapsedTicks
0 голосов
/ 02 февраля 2019

Поскольку вы, похоже, не беспокоитесь о самом алгоритме сортировки, вы можете перебирать кортежи и выгружать сортировку в SortedList следующим образом:

Сортировать список числовых кортежей

using System;
using System.Collections.Generic;

namespace ConsoleApp
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Tuple<double, int, int>> FHM = new List<Tuple<double, int, int>>();
            FHM.Add(Tuple.Create(2500.00, 1, 5));
            FHM.Add(Tuple.Create(2400.00, 2, 300));
            FHM.Add(Tuple.Create(2300.00, 4, 10));
            FHM.Add(Tuple.Create(2600.00, 1, 325));

            var sorted = new SortedList<double, Tuple<double, int, int>>();
            foreach (Tuple<double, int, int> t in FHM)
            {
                sorted.Add(t.Item1, t);
            }
        }
    }
}
...