用scheme最基本的元素定义排序函数
用到的元素有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最基本的元素定义排序函数的更多相关文章
- JQuery利用sort对DOM元素进行排序
前言 排序对于我们是再熟悉不过了,在绝大数应用程序中都会有这样一个场景:当我们从服务器端获取一个列表时,在界面上进行渲染,我们可以会依赖于某一个规则来进行排序,当然此时绝大多数会再次与服务器进行交互来 ...
- 有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)
解题思路: 排序方法:多路归并排序 每次将n个list的头元素取出来,进行排序(堆排序),最小元素从堆中取出后,将其所在list的下一个元素 放入堆中,调整堆序列. 函数实现原型: void list ...
- [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法
对数组中的元素进行排序. 此方法按 Unicode 值排序. (ASCII 是 Unicode 的一个子集.) 默认情况下,Array.sort()按以下方式进行排序: 1. 排序区分大小写(Z优先于 ...
- sort() 方法用于对数组的元素进行排序
语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...
- 对数组元素进行排序的方法总结(利用C++)
首先,对数组元素进行排序方法总结为以下两类: 一.简单排序算法(时间复杂度O(n*n)) 1.插入排序 2.选择排序 3.交换排序,即冒泡排序 二.先进排序算法(时间复杂度O(n*logn)) 1.快 ...
- #AOS应用基础平台# 添加了用户自己定义快捷菜单在平铺布局下的用户自己定义排序管理
#AOS开发平台# 添加了用户自己定义快捷菜单在平铺布局下的用户自己定义排序管理.
- jQuery.sort对DOM元素进行排序
实例: 每个tr的第三列显示的都是数字,我们就以这数字列作为排序依据,方法就是利用jquery的sort()方法. 首先,利用jquery选择器获取每个tr元素,获取回来是一个数据: var $trs ...
- time元素定义的格式
time元素表示的是24小时中的某一个时刻或日期,表示时间时允许时差. time元素定义的格式如下: <time datetime="2016-6-15">2016年6 ...
- 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...
随机推荐
- [LeetCode] Next Greater Element III 下一个较大的元素之三
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
- 坑:JavaScript 中 操作符“==” 和“===” 的区别
标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...
- LGTB 与序列
LGTB 有一个长度为N 的序列A,现在他想构造一个新的长度为N 的序列B,使得B 中的任意两个数都 互质. 并且他要使ai与bi对应项之差最小 请输出最小值 输入 第一行包含一个数N 代表序列初始长 ...
- ●洛谷P2495 [SDOI2011]消耗战
题链: https://www.luogu.org/problemnew/show/P2495题解: 虚树入门,树形dp 推荐博客:http://blog.csdn.net/lych_cys/arti ...
- [USACO12OPEN]书架Bookshelf
Description 当农夫约翰闲的没事干的时候,他喜欢坐下来看书.多年过去,他已经收集了 N 本书 (1 <= N <= 100,000), 他想造一个新的书架来装所有书. 每本书 i ...
- [LSGDOJ1822]书架 Splay
题目描述 Sally有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. Sally在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一 ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)
前四题比较水,E我看出是欧拉函数傻逼题,但我傻逼不会,百度了下开始学,最后在加时的时候A掉了 AC:ABCDE Rank:182 Rating:2193+34->2227 终于橙了,不知道能待几 ...
- hdu 4267 线段树间隔更新
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- day4 liaoxuefeng--调试、线程、正则表达式
一.错误.调试和测试 二.进程和线程 三.正则表达式
- RESTful 最佳实战
在GitHub上看到一本不错的关于REST实战的书,很高兴分享阅读笔记.[下载地址] 一.什么是REST(WHAT) REST架构描述了六种约束.(统一接口.无状态.可缓存.CS架构.分层系统.按需编 ...