@无所不能的风:

js中reduce、every、map这些api是吸收了FP(函数式编程)的优点引入的,这些api有一个特点,就是将函数名作为变量传入到函数中,这些函数有个专业名词叫高阶函数

函数名也是可以作为变量的,如果你学过C语言,可以类比函数指针,它跟var i = 1这种的区别在于它指向的是一个函数,函数一般是有参数的(无参可以看成是有参的特例),所以函数变量是不完整的,需要在运行时传入参数

回到sort上来,我们来自己实现一个冒泡排序方法

function bubbleSort(arr){

for (let i = 0; i < arr.length - 1; i++) {

for (let j = 0; j < arr.length - i - 1; j++) {

// 顺序:如果前一个数大于后一个数,则交换

if(arr[j] > arr[j + 1]){

const temp = arr[j]

arr[j] = arr[j + 1]

arr[j + 1] = temp

}

}

}

}

const array = [1, 10, 5, 2, 6, 9, 8]

bubbleSort(array)

console.log(array)

// Output: [1, 2, 5, 6, 8, 9, 10]

上面是顺序,如果需要倒序,则要将大于改成小于,其它不变。根据IoC控制反转思想,这种变化应该交给调用者。现在就变成了如何抽象这个if条件,它的输入是两个变量(分别是数组的前后两个元素),输出是一个bool,这正好可以用一个bool compare(n1, n2)函数来表示,所以可以改造成如下:

// 顺序比较

function orderedCompare(n1, n2){

return n1 > n2

}

// 倒序比较

function reversedCompare(n1, n2){

return n1 < n2

}

function bubbleSort(arr, compare){

for (let i = 0; i < arr.length - 1; i++) {

for (let j = 0; j < arr.length - i - 1; j++) {

if(compare(arr[j], arr[j + 1])){

const temp = arr[j]

arr[j] = arr[j + 1]

arr[j + 1] = temp

}

}

}

}

const array = [1, 10, 5, 2, 6, 9, 8]

bubbleSort(array, reversedCompare)

console.log(array)

// Output: [10, 9, 8, 6, 5, 2, 1]

上面的compare函数也可以用ES6箭头函数来代替简化。

大概就是这样了。

compare函数c语言,sort(compare)方法相关推荐

  1. r语言 tunerf函数_R语言︱常用统计方法包 机器学习包(名称、简介)

    一.一些函数包大汇总 转载于:http://www.dataguru.cn/thread-116761-1-1.html 时间上有点过期,下面的资料供大家参考 基本的R包已经实现了传统多元统计的很多功 ...

  2. c语言sort函数从小到大排序指针,sort排序是从小到大

    java数组排序问题:array.sort()是从小到大排序,别告诉我从i=a.length开始打印然后i.因为数组没变啊,只是打印顺序变Integer [] array=new Integer[]{ ...

  3. c语言sort函数包,qsort函数、sort函数【转】

    http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...

  4. POJ1256 (C++ compare函数)

    问题: 有一个只含大小写字母的字符串,给出所有该字符串的排列,以字典顺序输出.其中 'A'<'a'<'B'<'b'<...<'Z'<'z'. 方法: 只需调用C++ ...

  5. compare用法java_Java中的Compare和Comparator的使用方法

    Java中的Compare和Comparator的使用方法 发布时间:2020-05-23 09:24:06 来源:亿速云 阅读:358 作者:Leah 如何使用Java中的Compare和Compa ...

  6. C++中字符串的比较,compare()函数

    字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较. Basic_string 类模板既提供了  >.<.==.>=.<=.!= 等比较运算符,还提供了 c ...

  7. R语言层次聚类(hierarchical clustering):数据缩放、PCA聚类结果可视化、fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性

    R语言层次聚类(hierarchical clustering):数据缩放.PCA聚类结果可视化.fpc包的clusterboot函数通过bootstrap重采样的方法评估hclust层次聚类的稳定性 ...

  8. R语言Kmeans聚类、抽取聚类簇:fpc包clusterboot函数通过bootstrap重采样的方法评估Kmeans聚类的稳定性、fpc包的kmeansruns函数通过CH准则和ASW获取最优K值

    R语言Kmeans聚类.抽取聚类簇:fpc包的clusterboot函数通过bootstrap重采样的方法评估Kmeans聚类的稳定性.fpc包的kmeansruns函数通过Calinski-Hara ...

  9. Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略

    Python语言学习之lambda:lambda函数的简介.使用方法.案例大全之详细攻略 目录 lambda函数的简介 1.lambda匿名函数的格式 2.lambda函数特点 3.lambda函数与 ...

最新文章

  1. python 类的特殊属性、特殊方法 __str__,__bases__,__mor__,__add__,__call__
  2. IOS中UITableview中封装九宫格
  3. leetcode 91. 解码方法(dp)
  4. C#使用SQLite数据库的代码示例
  5. Android 下 Kernel Debug (Qualcomm Chipset)
  6. 斗鱼主播后台礼物数据爬取
  7. 3D旋转相册代码及详细使用教程
  8. vue 数字正则表达式详解
  9. Confluence 摘要(Excerpt)宏
  10. NPM install报错certificate has expired
  11. 希尔排序及手推时间复杂度(java实现)
  12. [论文阅读-NeRF+SLAM] iMAP:首个隐式场景表征的实时SLAM
  13. [转]程序员生涯之我见 找到自己的兴趣所在
  14. 20230308-二维数组的长度
  15. C++输入日期判断是周几
  16. 【NumPy】 快速构建 ndarray 对象(np.empty、np.full、np.titl、np.r_、np.linspace)
  17. php 位深度,支撑位和阻力位的分析:究竟哪些位置可以形成阻力位和支撑位? 深度教程(图解)...
  18. Android4.4 内置应用默认打开无障碍服务
  19. 真实世界的Haskell(影印版)
  20. Fedora24!到此一游

热门文章

  1. 阿里OSS 渗透案例
  2. matlab笔记——绘图篇——折线图+散点图+饼图+直方图+柱状图+箱线图+三维图+地图
  3. 如何用计算机画出分子轨道图,定性分子轨道理论简介
  4. 【蓝桥杯】单片机学习(10)——I2C通信协议与E2PROM
  5. 磁盘结构损坏且无法读取一种解决办法
  6. html中圆点标签,HTML标签大全(类型)
  7. Eclipse切换SVN账号操作
  8. Armadillo 4.xx - 5.xx HWID Changer v.0.2 by TrueLies
  9. 2006年第一学期小小班个人计划
  10. B站大学开课了-《数字集成电路静态时序分析基础》