尝试获取子查询执行的次数

时间:2018-12-05 14:30:53

标签: c# linq

我有一些代码可以将数组按升序排序

int[] array = new int[] { 4, 3, 5, 1 };
var result = array.GroupBy(x => x)
                    .OrderBy(g => g.Count())
                    .ThenBy(g => g.Key)
                    .SelectMany(g => g);

我希望能够计算完成排序所需的步骤数。 我要解决的具体问题是: 您将获得一个无序数组,该数组由连续的整数[1、2、3,...,n]组成,没有重复项。您可以交换任意两个元素。您需要找到按升序对数组进行排序所需的最小交换次数。

我可以找到LINQ使用的掉期数量吗?

有可能得到这个吗?

例如,如果查询必须将4与1交换以获得1,3,5,4,然后将5与4交换以获得1,3,4,5,那么这将是2个步骤。

1 个答案:

答案 0 :(得分:1)

这就是我的想法。我找不到它与LINQ一起使用的方式,但是我们有自己的排序算法。我做了这样的事情:

static void Main(string[] args)
    {
        ObservableCollection<int> array = new ObservableCollection<int>() {4,3,1,5 };
        int steps = 0;
        array.CollectionChanged+= (sender, e) => 
        {
            Console.WriteLine($"{e.Action} : {string.Join(",", array) }" );
            steps++;
        };

        bool didSwap;
        do
        {
            didSwap = false;
            for (int i = 0; i < array.Count - 1; i++)
            {
                if (array[i] > array[i + 1])
                {
                    int temp = array[i + 1];
                    array[i + 1] = array[i];
                    array[i] = temp;
                    didSwap = true;
                }
            }
        } while (didSwap);


        Console.WriteLine("Sorted Result :");
        foreach(var item in array)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine($"Total Swapps {steps / 2}");

        Console.ReadLine();
    }

这是输出:

enter image description here