用到的元素有9个:

define,if,null?,cons car,cdr,lambda,let,named let,

其实let 和 named let可以去掉.但那样会带来性能和可读性下降的问题.

排序类型选的是经典的快速排序.

;筛选函数
(define (filter f x)
(let recur ((x x))
(if (null? x)
'()
(if (f (car x))
(cons (car x) (recur (cdr x)))
(recur (cdr x)))))) ;三元合并函数,形如'(1 2) , 3 , '(4 5)合并为'(1 2 3 4 5)
(define (merge x y z)
(let recur ((x x))
(if (null? x)
(cons y z)
(cons (car x) (recur (cdr x)))))) ;最原始的排序函数形式(升序)
(define (sorted x)
(if (null? x)
'()
(if (null? (cdr x))
x
(merge (sorted (filter (lambda (i) (< i (car x))) (cdr x)))
(car x)
(sorted (filter (lambda (i) (>= i (car x))) (cdr x))))))) ;加入默认参数功能,控制升降序且高性能版本
(define (sort x . y)
(let ((lef (if (null? y) < (if (= (car y) 0) < >=)))
(rig (if (null? y) >= (if (= (car y) 0) >= <))))
(let recur ((x x))
(if (null? x)
'()
(let ((fir (car x))(rest (cdr x)))
(if (null? rest)
x
(merge (recur (filter (lambda (i) (lef i fir)) rest))
fir
(recur (filter (lambda (i) (rig i fir)) rest))))))))) (sorted '(4 3 2 1 0))
(sort '(4 3 2 1 0) 0)
(sort '(4 3 2 1 0))
(sort '(5 6 7 8 9) 1)
(sort '(5 6 7 8 9))

结果:

(0 1 2 3 4)
(0 1 2 3 4)
(0 1 2 3 4)
(9 8 7 6 5)
(5 6 7 8 9)
>

这次的主要收获是发现应该大胆采用let来避免重复计算,例子中的lef, rig, fir, rest 就是很好的证明.

不要觉得这样会导致代码层次过多,性能才更重要.

更何况有时let也能提高可读性.

用scheme最基本的元素定义排序函数的更多相关文章

  1. JQuery利用sort对DOM元素进行排序

    前言 排序对于我们是再熟悉不过了,在绝大数应用程序中都会有这样一个场景:当我们从服务器端获取一个列表时,在界面上进行渲染,我们可以会依赖于某一个规则来进行排序,当然此时绝大多数会再次与服务器进行交互来 ...

  2. 有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)

    解题思路: 排序方法:多路归并排序 每次将n个list的头元素取出来,进行排序(堆排序),最小元素从堆中取出后,将其所在list的下一个元素 放入堆中,调整堆序列. 函数实现原型: void list ...

  3. [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法

    对数组中的元素进行排序. 此方法按 Unicode 值排序. (ASCII 是 Unicode 的一个子集.) 默认情况下,Array.sort()按以下方式进行排序: 1. 排序区分大小写(Z优先于 ...

  4. sort() 方法用于对数组的元素进行排序

    语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...

  5. 对数组元素进行排序的方法总结(利用C++)

    首先,对数组元素进行排序方法总结为以下两类: 一.简单排序算法(时间复杂度O(n*n)) 1.插入排序 2.选择排序 3.交换排序,即冒泡排序 二.先进排序算法(时间复杂度O(n*logn)) 1.快 ...

  6. #AOS应用基础平台# 添加了用户自己定义快捷菜单在平铺布局下的用户自己定义排序管理

    #AOS开发平台# 添加了用户自己定义快捷菜单在平铺布局下的用户自己定义排序管理.

  7. jQuery.sort对DOM元素进行排序

    实例: 每个tr的第三列显示的都是数字,我们就以这数字列作为排序依据,方法就是利用jquery的sort()方法. 首先,利用jquery选择器获取每个tr元素,获取回来是一个数据: var $trs ...

  8. time元素定义的格式

    time元素表示的是24小时中的某一个时刻或日期,表示时间时允许时差. time元素定义的格式如下: <time datetime="2016-6-15">2016年6 ...

  9. 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...

随机推荐

  1. c#之监控文件结构

    如果需要知道修改文件或目录的时间,可以通过FileSystemWatcher类,这个类提供了一下应用程序可以捕获的事件,应用程序可以对事件作出响应. 使用FileSystemWatcher非常简单,首 ...

  2. 树莓派控制HC-SR04超声波模块测距(新手向+C语言向)

    因为作业要求使用c语言代码,这里先附上一段摘自网上的代码 感谢KalaerSun的c语言代码,摘自https://blog.csdn.net/qq_25247589/article/details/6 ...

  3. 使用Nwjs开发桌面应用体验

    之前一直用.net开发桌面应用,最近由于公司需要转为nodejs,但也是一直用nodejs开发后台应用,网站,接口等.近期,需要开发一个客户端,想着既然nodejs号称全栈,就试一下开发桌面应用到底行 ...

  4. [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter

    Description The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Sea. The is ...

  5. P2515 [HAOI2010]软件安装

    树形背包 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  6. ●BZOJ 4176 Lucas的数论

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4176 题解: 莫比乌斯反演,杜教筛 首先有这么一个结论: 令d(n)表示n的约数的个数(就是 ...

  7. BestCoder 1st Anniversary ——HDU5312(数学推导)

    Today, Soda has learned a sequence whose n-th (n≥1) item is 3n(n−1)+1. Now he wants to know if an in ...

  8. 勤拂拭软件系列教程 之 Android开发之旅

    勤拂拭软件工作室持续推出Android开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢Android的朋友们学习进步: 1. 勤拂拭软件Android开发之旅(1) 之 Android 开发环 ...

  9. salt基本使用之一(1)

    1.帮助文档 以cmd函数为例子说下salt中的一些帮助信息 # 查看指定modules用法 salt '*' sys.doc cmd # 查看所有的modules列表 salt '*' sys.li ...

  10. Intellij idea: java.lang.ClassNotFoundException:javax.el.ELResolver异常解决办法

    使用Intellij idea编译过程中遇到的问题及解决办法. 由于编译时候报javax.servlet不存在,我把tomcat下的servlet-api.jar放到了External Librari ...