适配字母排序的冒泡排序函数代码修改求助
嘿,这个坑我刚学Lisp的时候也踩过!数字的比较运算符确实没法直接用在字母(字符)上——你得换成语言专门提供的字符比较工具才行。下面给你具体的修改方案,分场景说清楚:
核心修改:替换数字比较符为字符专用函数
不管你用的是Scheme还是Common Lisp,都有专门针对字符的比较函数,直接代替原来的>和=:
- 把判断字母大小的
(if (> y x))改成(if (char>? y x))(Scheme)或(if (char> y x))(Common Lisp) - 把判断字母相等的
(if (= xs ys))改成(if (char=? xs ys))(Scheme)或(if (char= xs ys))(Common Lisp)
这些函数会根据字符的ASCII值来比较,刚好符合字母表的顺序(注意:默认大写字母ASCII值比小写小,所以大写会排在前面,比如A < a)
完整的冒泡排序示例(以Scheme为例)
这里给你一个能正常排序字母字符的冒泡排序实现,你可以对照着改自己的代码:
; 对字符列表进行冒泡排序 (define (bubble-sort-letters char-list) ; 单次遍历,交换相邻的逆序字符 (define (swap-pass lst) (if (null? (cdr lst)) lst (let ((first (car lst)) (second (cadr lst))) ; 用char>?判断字符顺序,逆序就交换 (if (char>? first second) (cons second (cons first (swap-pass (cddr lst)))) (cons first (swap-pass (cdr lst))))))) ; 循环进行交换,直到列表完全有序 (let loop ((current-list char-list) (sorted-part '())) (if (null? current-list) sorted-part (let ((passed-list (swap-pass current-list))) (loop (drop-right passed-list 1) (cons (last passed-list) sorted-part)))))) ; 测试示例:把字符串转成字符列表排序,再转回字符串 (display (list->string (bubble-sort-letters (string->list "dCba")))) ; 输出:"abcd"
进阶:忽略大小写排序
如果需要不区分大小写(比如把"BaC"排成"abc"),只需要在比较前把两个字符统一转成大写或小写:
把上面的(char>? first second)改成:
(char>? (char-downcase first) (char-downcase second))
这样不管是大写还是小写,都会按字母表本身的顺序排序。
如果你处理的是字符串而不是单个字符
如果你的输入是完整的字符串(比如要排序单词列表),那就要用字符串比较函数,比如Scheme的string>?或者Common Lisp的string>,逻辑和字符排序是一样的,只是把比较对象从单个字符换成字符串就行。
内容的提问来源于stack exchange,提问作者javacoder123
相关产品推荐
相关产品推荐

