排序函数SORT

Excel常用的技巧,排序大家都用过,但是排序会改变原始数据源,排完序还要回到原始样子,那这时候我们不得不使用函数。SORT函数在微软365及WPS都可以使用,它的功能和排序功能类似,我们直接进入参数学习。

一、参数

参数=SORT(array,[sort_index],[sort_order],[by_col])

一参:是我们要排序的数组,也可是是一个区域引用。

二参:根据第几列排序,可以省略,默认是按第一列。

三参:升序还是降序。可以省略,默认是升序。

第四:按行还是按列。(学习unique函数的时候有此参数)

二、效果展示

对薪资升序排列,第二参数给4代表第四列,第三参数给1 代表升序,当然第三参数我们也可以不写。

三、参数详解

a.一参

一参不用多说,一个区域,一个数组都是可以进行排序的,比如用FILTER筛选的结果区域在进行排序,这是实际工作中非常常用的搭配。

b.二参

第二参数就是一个数字,你要告诉SORT,你要根据第几列排序。这里需要注意的是,不允许给0,也不超过一参的列数。那他能否像TAKE或者CHOOSEROWS使用负数呢,我直接告诉大家,这里是不允许的。大家可自行尝试。这里再次强调,第二参数省略。代表按照第一列排序,详见图3。除此之外,这个参数和第三参数一样,它可以给一个常量数组,在文末会给大家演示。

图1

图2

图3

c.三参

三参有两种 1代表升序,-1代表降序。我们演示个降序的情况(图4)。

图4

d.第四

第四参数我们几乎不用,它代表按行案列。我们上文举例的都是按照行去排序。大家可以看到我们是比较每行的大小。如果是数字他会比较数字大小,如果是汉字他会按照汉语拼音排序。

当我们的数据需要按列排序的时候,也就是每列去对比,才会用到第四参数。详见图5,第四参数使用TRUE或者1 都可以。

三、案例分享

a.公司前三名薪资的人

我们想找出薪资前三的人有哪几个。那我们的思路就是排序,我们可以降序,也可以升序,总之就是前三个或者后三个是我们想要的数据。

先用sort降序排列,然后用take函数提取前三行。然后我们只需要人名,那人民在我们take结果区域的第二列。我们直接使用choosecols得到最终的答案。

b.项目组最高薪资的人

那这时候我们直接排序是没有办法直接获取结果的,我们需要使用之前学过的FILTER函数筛选,获得所有项目的数据,然后再进行排序,然后再取最高的姓名。

在最后一部我们没有使用choosecol函数,使用index也可以提取第二列。这里也是一个小技巧,当我们的结果只有一行或者一列的时候。=INDEX(array,row_num,column_num),第三参数可以省略,直接输入第二参数即可。它会自动识别是第几行或者第几列。如果你没有接触过index函数,可以继续使用我们之前教学过的choosecols函数。

c.模拟主次条件排序

在常用功能中有主条件,次条件排序。那使用sort函数的数组用法也可以实现。我们先按照部门排序,然后再按薪资排序。我们看几种情况。

  1. 部门升序,薪资升序

我们第二参数{3,4},意思就是先按第三列排,再按第4列排,第三参数我们没有写。默认都是升序排列。如果都降序排列只需要给第三参数-1即可。

  1. 部门升序,薪资降序

我们第二参数还是{3,4},第三参数我们也给一个数组,和第二参数对应,{1,-1},就代表第三列升序,第四列降序。

Excel办公技巧:排序函数SORT用法解析

大家好,今天跟大家分享一下排序函数SORT的语法结构和应用案例。

SORT函数的语法结构如下:

=SORT(数组,[sort_index],[sort_order],[by_col])

第一个参数“数组”为要排序的范围或数组;

第二个参数sort_index代表要依据第一个参数中的第几行或第几列进行排序;

第三个参数sort_order用于指定所需排序顺序,1表示升序(默认),-1表示降序;

第四个参数by_col是指定所需排序方向的逻辑值,FALSE指按行排序(默认),TRUE指按列排序。

前后带中括号[]的参数为可选参数。

将下图工作表A:D列中的原始数据按组别升序排序,结果返回至F:I列。

操作步骤:

选中F3单元格,输入公式:=SORT(A3:D10,1,1),回车确认公式,即可快速返回按组别升序排序后的结果。

公式说明:

第一个参数A3:D10为要进行排序的范围;

第二个参数1在这里代表要依据排序范围的第1列“组别”排序;

第三个参数1代表要进行升序排序;

第四个参数公式进行了省略,默认按行排序。

将下图工作表A:D列中的原始数据按组别升序、成绩升序进行排序,结果返回至K:N列。

操作步骤:

选中K3单元格,输入公式:=SORT(A3:D10,{1,4},1),回车确认公式,即可快速返回按组别升序、成绩升序排序后的结果。

公式说明:

第一个参数A3:D10为要进行排序的数据范围;

第二个参数{1,4}在这里代表要依据数据范围的第1列(组别)和第4列(成绩)进行排序;

第三个参数1代表要进行升序排序;

第四个参数公式进行了省略,默认按行排序。

本文由原创,欢迎关注留言,一起学习更多职场办公技能!

数组的 sort() 方法详解

纸上得来终觉浅,绝知此事要躬行!

在上一篇文章中,我们简单介绍了 arr.sort() 方法的基本使用:

用归用,照葫芦画瓢不难,大家日常也是这么写的,没毛病!但是如果对一个方法不进行深入研究,那么就很容易踩坑,并且常常会填不了坑!

今天,我们重点聊聊比较函数 compareFunction 相关的知识。

为了接下来的思路能够更顺畅,在学习比较函数之前,我们先来了解一下有关插入排序的原理。

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法描述:

一般来说,插入排序都采用 in-place 在数组上实现:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后;
  • 重复步骤2~5。

动图演示

插入排序

其实可以用一句话总结:从数组中第二个元素起(第一个元素已默认排序),每个元素都充当一次游标值,依次和它前面的(已排序)的元素相比较,如果游标值小,则将拿来比较的元素向后移一位,继续向前比较;否则,将游标值插入比较值的后面,结束比较。

如果想要 sort() 方法按照一定的规则进行排序(比如数字大小),那么就需要给它指定比较函数 compareFunction。

如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序,它有两个参数 a 和 b,返回值如下:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前。
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

我们暂不做什么复杂的分析,先使用控制台打印一下看看 a 和 b 到底是什么:

执行结果如下:

通过上图,我们可以看到:

  • a 的值在按照原数组中的顺序依次变化,这个排序采用的应该是插入排序法
  • a 代表的应该是游标
  • 从 b 值的变化上又可以看出,a 首次找位置时采用了二分法,a < b 则向前比较, a>b 则向后比较。

那么,其机理到底是不是我们所看到这样一个过程,还需要再探究。

要想弄清楚一个问题,还有什么比从根源上着手效率更高的呢?所以我们追根溯源,先来扒一扒 v8引擎 的源码,看看它内部到底是怎么实现 sort 接口的。

下面的源码来自7.2版本之前的 v8,该版本之后的数组排序实现变化较大,暂不予讨论。

其中 array.js 文件下,关于 sort 接口实现的代码如下:

代码分析:

  1. v8 中实现 sort() 方法时,采用了 ”插入排序“ 和 ”快速排序“ 两种排序方式。
  2. 对于短数组(长度 <= 22)来说,插入排序效率更高。
  3. 如果没有传入 comparefn ,则生成一个 comparefn 比较函数。
  4. 在自动生成的比较函数中,会将传入的数组元素通过 TO_STRING 方法转换为字符串,再行比较。
  5. 对比比较函数中的 b 为游标值,这一点和最新版的 chrome 浏览器表现不同。

我们在 sort 方法中传入的函数用在了这里:

根据我们传入函数的返回值,数组进行排序操作:

  • 如果返回值(a-b)大于0,即 a > b, 则将当前拿来比较的值 a 复制给它的下一位,并继续使用游标值 b 向前进行比较。
  • 如果返回值小于等于 0 ,则结束比较,并将游标值 b 填在最后一次比较值 a 的后面。

不管是旧版本还是最新版本的 v8,它们的 sort() 方法的返回结果都没有发生变化,只是内部的实现机理有了改变(肯定是向着更优的方向改变)。

为了是 sort() 的返回结果符合预期,我们给它传入了一个函数作为比较规则。

在比较函数中,因 v8 版本不同,实现机制有差异,导致它的参数意义也不大相同,所以我们暂时无需关心它里面参数的具体含义。

比较函数如果写完全的话,应该是:

即比较函数的返回值严格来说只有三个:-1、0 和 1 。

我们主需要记住 return a – b 是升序排列,return b – a 是降序排列即可。

~本文完

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好!我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。