前言
从力扣刷题时发现自己对于Array.Sort仍然有理解不到位和忘记使用方法的情况,所以写下文章记录
一维数组
int[] array = new int[];
Array.Sort(array);
Array.Sort默认是从小到大排序,那么如果想让一维数组从大到小排序?
Array.Sort(arr, (a,b) => b-a);
一行Lambda就能完成,原理后面讲
二维数组
严格来说,二维数组本身其实不能使用Array.Sort(),但二维数组本身就是由两个一维组成,即行和列,所以拿二维数组里的一个维度去使用Array.Sort()也没啥问题,但基本常用的就一种方式
如下的Lambda表达式
int[][] array = { new int[] { 1, 3 }, new int[] { 2, 1 }, new int[] { 4, 2 } };
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i][1]);
Console.Write(" ");
}
Array.Sort(array, (a, b) => a[1]-b[1]); //重点在这里
Console.WriteLine();
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i][1]);
Console.Write(" ");
}
结果图:
既然可以从小到大排,当然也可以从大到小排,关键代码如下:
Array.Sort(array, (a, b) => b[1] - a[1]);
运行结果:
到这里你应该发现了,Lambda表达式显然是有一定规则的,这样的规则就导致了排序是怎样排的,接下来可以看看原理了
原理分析
对于这样的表达式:Array.Sort(array, (a, b) => a[1]-b[1]),只从表达式分析就是将a和b作为变量传入,计算a[1]与b[1]的差然后返回一个值;考虑实际的应用,它的过程是遍历二维数组的第二列的每两个元素,返回a[1]-b[1]的差值
那么再来看看下面这段代码
Array.Sort(array, (a, b) =>
{
if (a[1] > b[1]) return 1;
else if (a[1] == b[1]) return 0;
else return -1;
});
运行结果:
很明显,这段代码等效于
Array.Sort(array, (a, b) => b[1] - a[1]);
从更复杂的Lambda表达式可以看出,返回值正是排序的规则
那么这段代码的运行后,如何排序?
Array.Sort(array, (a, b) =>
{
return 1;
});
运行结果:
从这里我们就发现了元素的比较顺序,也就是按照平常的两层for循环比较元素的方法对两个元素进行比较,返回值为1就会交换两个元素;如果将return 1改为return 0或return -1则不会发生交换,读者可以自行尝试
原理
- Array.Sort()本质是依据返回值来进行元素交换,返回值大于0时会进行交换;返回等于0和小于0的值不会移动位置
总结
Array.Sort(array, (a, b) => a[1] - b[1]); //从小到大排序
Array.Sort(array, (a, b) => b[1] - a[1]); //从大到小排序
根据原理,本质是返回值的不同导致了排序的不同。就如同本文的例子,对于3,1,2的序列,第一行代码就是用3-1得到大于0的数,所以3和1交换位置,变为序列1,3,2;然后是1-2得到小于0的数,所以1和2不交换位置,接着是3-2得到大于0的数,所以3和2交换位置,最后序列就是1,2,3
第二行的代码也可以自己推理验证,结果是显而易见的
后话
本人水平有限,文章中如有错误或是不严谨的地方,请务必在评论区留下你的意见