【C#实战分析】C#Array.Sort原理与应用

前言

从力扣刷题时发现自己对于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则不会发生交换,读者可以自行尝试

原理

  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

第二行的代码也可以自己推理验证,结果是显而易见的

后话

本人水平有限,文章中如有错误或是不严谨的地方,请务必在评论区留下你的意见

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值