选择排序算法排序错误

时间:2018-11-22 08:57:27

标签: c# algorithm sorting selection-sort

好的,我对选择排序算法有疑问。它将对int进行排序就很好了,但是当我尝试将其用于double时,它将开始随机排序。
这是我的代码

   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 :(得分:1)

就像注释中已经提到的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();

答案 1 :(得分:0)

您需要将地点更改为 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;
    }
}