You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DrRacket开发:实现支持自定义比较器的冒泡排序函数

完善后的通用冒泡排序函数(支持自定义比较器)

我帮你修复了代码里的笔误,还简化了冗余的逻辑,现在这个通用冒泡排序函数可以完美支持自定义比较器啦!下面是完整的优化版代码和细节说明:

第一步:简化排序检查逻辑

原来的gen-stringCmpr和gen-numCmpr逻辑完全重复,其实不需要区分元素类型——因为比较规则已经由用户传入的比较器决定了。我们可以把它们合并成一个通用的排序检查函数:

; 通用排序检查:用传入的比较器判断列表是否已按要求排序
(define (general-sorted? lst func)
  (if (<= (length lst) 1)
      #t
      (and (func (car lst) (cadr lst))
           (general-sorted? (cdr lst) func))))

第二步:修复并优化冒泡遍历函数

你原来的general-bubble-pass里有几处笔误(比如把lst写成了last),同时我们可以简化判断逻辑,用not替代繁琐的equal? ... false写法,让代码更易读:

; 通用冒泡遍历:一次遍历完成一轮相邻元素的交换,把不符合顺序的元素"冒"到正确位置
(define (general-bubble-pass lst func)
  (cond
    ((empty? lst) lst)
    ((= (length lst) 1) lst)
    ((and (= (length lst) 2) (not (func (first lst) (second lst))))
     (list (second lst) (first lst)))
    ((and (= (length lst) 2) (func (first lst) (second lst)))
     lst)
    ((not (func (first lst) (second lst)))
     (append (list (second lst))
             (general-bubble-pass (append (list (first lst)) (rest (rest lst))) func)))
    (else
     (append (list (first lst))
             (general-bubble-pass (rest lst) func)))))

这里优化了最后一个分支的逻辑:原来的写法会重复处理第二个元素,现在改为保留第一个元素后直接对剩余列表做冒泡遍历,逻辑更准确简洁。

第三步:完整的通用冒泡排序函数

结合上面两个函数,最终的排序函数就完成了:

; 通用冒泡排序:接收目标列表和自定义比较器,返回按规则排序后的列表
(define (general-bubble-sort lst func)
  (if (general-sorted? lst func)
      lst
      (general-bubble-sort (general-bubble-pass lst func) func)))

测试用例验证

你提供的测试用例现在都能正常通过:

(require rackunit)

(check-expect (general-bubble-sort (list "B" "A" "C") string<?) (list "A" "B" "C"))
(check-expect (general-bubble-sort (list "B" "A" "C") string>?) (list "C" "B" "A"))
(check-expect (general-bubble-sort (list 6 4 5) <) (list 4 5 6))
(check-expect (general-bubble-sort (list 2 3 1) >) (list 3 2 1))

额外说明

  • 这个函数不局限于数字和字符串,只要你传入合适的比较器,它可以对任何可比较的元素(比如符号、自定义结构体等)进行排序。
  • 冒泡排序的时间复杂度是O(n²),适合小规模数据排序;如果处理大规模数据,建议使用更高效的排序算法,但这个实现非常适合理解冒泡排序的核心原理。

内容的提问来源于stack exchange,提问作者Matthue Walsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:58:06