sort()方法理解
来源:知乎

从大到小排序(一列东西, 一个比较函数) {
...
比较结果 = 比较函数(东西1, 东西2)
讨论 比较结果 {
大于零 说明 东西1 比 东西2 大
小于零 说明 东西1 比 东西2 小
等于零 说明 东西1 和 东西2 相等
}
...
}
也就是说你在用这个排序算法的时候, 除了需要传入一列东西以外, 还需要传入一个比较函数. 为什么呢? 注意这个排序函数在利用比较函数干什么: 函数执行到这里, 它需要判断两个东西的大小. 整数/浮点数的大小比较倒是好说, 但是任意类型的两个对象怎么比较大小, 就需要程序员自定义了. 我们来考察一个比较函数的输入输出: 输入是同一类型的两个对象; 输出是三个状态 {大, 小, 相等}, 通常用 {大于零的值, 小于零的值, 零} 来分别代表. 也就是说, 比较函数是留给其他程序员自己定义任意类型的对象间大小关系的. 一个算法接收一个比较函数, 就能把具体两个对象怎么比较这件事从算法中分离 (抽象) 出来, 丢给别人做, 自己只关系高层的实现. 排序算法并不关心它手上的元素的序关系到底是怎么定义的, 它只需要知道比较结果.
一般来说, 如果你那一列东西是普通的数 (比如整数), 那么一般来说, 你所使用的程序语言的标准库早就帮你实现了几个用于数的默认比较函数, 不用你手传. 所以如果你一直只在代码中排一些整数或者浮点数, 而且总是直接用默认升降序来排, 那就没可能遇到要提供比较函数的情况.
你的代码定义了下面这个比较函数:
数值比较(数1, 数2) { 返回 数1 - 数2 }
这样, 你在调用排序函数的时候
从大到小排序([4, 2, 1, 3], 数值比较)
返回值为 [4, 3, 2, 1].
如果定义
数值逆比较(数1, 数2) { 返回 数2 - 数1 }
再执行
从大到小排序([4, 2, 1, 3], 数值逆比较)
其返回值就是 [1, 2, 3, 4]. 因为此时排序函数认为 1 比 2 "大".
为什么这么多数你只需要写两个?
答案: 你提供的比较函数会在排序函数中被不停地调用. 每当排序算法遇到需要知道两个数哪个大哪个小, 就会调用你的比较函数来看结果大小 (即执行答案一开始我展示出来的那段代码).
sort()方法理解的更多相关文章
- JavaScript深入理解sort()方法
一. 基本用法 let arr1 = [3, 5, 7, 1, 8, 7, 10, 20, 19] console.log(arr1.sort()) // [1, 10, 19, 20, 3, 5, ...
- (JavaScript基础向)sort()方法里的排序函数的理解
比较常见的解释可以看这里:js的sort()方法,这篇博客写得挺好的,一般的应用的理解已经足够了. 但是如果要活用sort()方法里面的参数——也就是排序函数的话,可能就比较难理解了. 然后我就总结出 ...
- JS sort() 方法
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. array.s ...
- js的sort()方法
说明 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. arra ...
- 深入了解javascript的sort方法
在javascript中,数组对象有一个有趣的方法 sort,它接收一个类型为函数的参数作为排序的依据.这意味着开发者只需要关注如何比较两个值的大小,而不用管“排序”这件事内部是如何实现的.不过了解一 ...
- 基于原生JS封装数组原型上的sort方法
基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...
- Javascript Array对象 sort()方法,记忆方法,方法扩展
相信 有很多 同仁们,尤其是初学者,在记住 Array对象 sort() 方法的排序,规则上,有点困难: 其实sort()方法已经在实际工作中用到很多遍了,可当我仔细推敲,这个sort()方法,什么时 ...
- JavaScript 中数组 sort() 方法的基本使用
在日常的代码开发中,关于数组排序的操作可不少,JavaScript 中可以调用 sort 方法对数组进行快速排序. 今天,就数组的 sort 方法来学习一下,避免日后踩坑的悲惨遭遇. 概念 sort ...
- 【JavaScript排序】 sort()方法(解决null、undefined、0之间的排序(混乱)问题)
JavaScript排序 - sort()方法 --解决null.undefined.0之间的排序(混乱)问题 一.普通的数组排序 JavaScript中用方法sort()为数组排序.sort() ...
随机推荐
- asp.net读取CSV
原文:asp.net读取CSV 用Excel导了两天数据,各种问题,折磨客户也折磨了自己,以前没发现的问题一下子都暴露出来了 特意收集两篇Excel跟CSV读取相关的两篇文章 asp.net读取exc ...
- c#万能视频播放器(附代码)
原文:c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的 ...
- ASP.NET MVC局部视图
使用ASP.NET MVC局部视图避免JS拼接HTML,编写易于维护的HTML页面 以前使用ASP.NET WebForm开发时,喜欢使用Repeater控件嵌套的方式开发前台页面,这样就不用JS ...
- UC编程:通过fwrite()和write()比较标准库函数和系统调用的速度
fwrte是C标准库中提供的函数,是对write函数的扩展与封装,write则是Unix系统提供的函数.按照常理来讲,系统调用肯定比使用库快的多,但是事实正好相反 Why?原因就在于缓冲的问题,fwi ...
- 使用Flexible实现手淘H5页面的终端适配(转)
曾几何时为了兼容IE低版本浏览器而头痛,以为到Mobile时代可以跟这些麻烦说拜拜.可没想到到了移动时代,为了处理各终端的适配而乱了手脚.对于混迹各社区的偶,时常发现大家拿手机淘宝的H5页面做讨论—— ...
- Android项目---语言适配
android多国语言文件夹 android多国语言文件夹文件汇总如下:(有些语言的书写顺序可能跟中文是相反的) 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中 ...
- Varnish缓存服务详解及应用实现
1.varnish的基本介绍 Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多.在1975年时,储存媒介只有 ...
- Java 感知Mysql存储过程变量数量
在项目中,可能会遇到sybase 移植到 mysql的情况,因为sybase 支持存储过程的可变参数,而mysql不能支持,所以,在调用mysql的时候,需要感知存储过程到底有几个参数,来合理的配置参 ...
- POCO Controller
---恢复内容开始--- POCO Controller 你这么厉害,ASP.NET vNext 知道吗? 写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 PO ...
- “String.h” 源代码总结
<String.h> 总结: 常用的函数: 一.memchr: 说明:当第一次遇到字符ch时停止查找.如果成功,返回指向字符ch的指针:否则返回NULL. 代码: #include ...