Алгоритм выбора-сортировки неверный - PullRequest
0 голосов
/ 22 ноября 2018

Хорошо, у меня проблема с алгоритмом сортировки выбора.Он будет сортировать целые числа просто отлично, но когда я пытаюсь использовать его для двойных чисел, он начинает сортировать случайным образом.
вот мой код

   using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sorter.ListSort;
using System.Collections;

namespace ConsoleApp20
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = new List<double>();
            x.Add(23.1);
            x.Add(1.5);
            x.Add(3);
            x.Add(15.23);
            x.Add(101.2);
            x.Add(23.35);
            var sorted = selectionSort(x);

            foreach (double s in sorted)
                Console.WriteLine(s);
            Console.ReadLine();
        }

        public static List<double> selectionSort(List<double> data)
        {
            int count = data.Count;
           // Console.WriteLine(count);

            for (int i = 0; i < count - 1; i++)
            {
                int min = i;
                for (int j = i + 1; j < count; j++)
                {


                    if (data[j] < data[min])
                        min = j;

                    double temp = data[min];
                    data[min] = data[i];
                    data[i] = temp;
                }
            }

            return data;
        }
    }
}

Теперь это то, что алгоритм возвращает

enter image description here Как мы видим, 3 НЕ больше 15.23, что происходит?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Подобно тому, как MoreON уже упоминался в комментариях, вы должны поменять местами элементы после того, как найдете минимальное значение.

Таким образом, это должно выглядеть так

    public static List<double> selectionSort(List<double> data)
    {
        int count = data.Count;
        // Console.WriteLine(count);

        for (int i = 0; i < count - 1; i++)
        {
            int min = i;
            for (int j = i + 1; j < count; j++)
            {
                if (data[j] < data[min])
                    min = j;
            }
            double temp = data[min];
            data[min] = data[i];
            data[i] = temp;
        }

        return data;
    }

Но если вы не хотите изобретать велосипед, вы также можете использовать:

var sorted = x.OrderBy(o => o).ToList();
0 голосов
/ 22 ноября 2018

Вам нужно поменять место на int min

for (int i = 0; i < count - 1; i++)
{
    for (int j = i + 1; j < count; j++)
    {
        int min = i;

        if (data[j] < data[min])
            min = j;

        double temp = data[min];
        data[min] = data[i];
        data[i] = temp;
    }
}
...