我有一些代码可以将数组按升序排序
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个步骤。
答案 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();
}
这是输出: