快速排序
Quicksort 是一种常见的排序算法,平均案例复杂度为 O(n log n)
,最坏情况下复杂度为 O(n^2)
。它优于其他 O(n log n)
方法的优势在于它可以就地执行。
Quicksort 将输入拆分为选定的透视值,将列表分成小于的值和大于(或等于)透视的值。使用 filter
可以轻松完成拆分列表。
使用它,Quicksort 的 Scheme 实现可能如下所示:
(define (quicksort lst)
(cond
((or (null? lst) ; empty list is sorted
(null? (cdr lst))) ; single-element list is sorted
lst)
(else
(let ((pivot (car lst)) ; Select the first element as the pivot
(rest (cdr lst)))
(append
(quicksort ; Recursively sort the list of smaller values
(filter (lambda (x) (< x pivot)) rest)) ; Select the smaller values
(list pivot) ; Add the pivot in the middle
(quicksort ; Recursively sort the list of larger values
(filter (lambda (x) (>= x pivot)) rest))))))) ; Select the larger and equal values