make argument order of heap-sort consistent with sort
Old order is also accepted for backwards compatibility.
This commit is contained in:
parent
462132515c
commit
28f1d4ff5d
|
@ -171,7 +171,18 @@
|
||||||
|
|
||||||
;; --------
|
;; --------
|
||||||
|
|
||||||
(define (heap-sort! <=? v)
|
;; preferred order is (heap-sort vec <=?), but allow old order too
|
||||||
|
(define (heap-sort! x y)
|
||||||
|
(cond [(and (vector? x) (procedure? y))
|
||||||
|
(heap-sort!* x y)]
|
||||||
|
[(and (vector? y) (procedure? x))
|
||||||
|
(heap-sort!* y x)]
|
||||||
|
[else
|
||||||
|
(unless (vector? x)
|
||||||
|
(raise-argument-error 'heap-sort! "vector?" x))
|
||||||
|
(raise-argument-error 'heap-sort! "procedure?" y)]))
|
||||||
|
|
||||||
|
(define (heap-sort!* v <=?)
|
||||||
;; to get ascending order, need max-heap, so reverse comparison
|
;; to get ascending order, need max-heap, so reverse comparison
|
||||||
(define (>=? x y) (<=? y x))
|
(define (>=? x y) (<=? y x))
|
||||||
(define size (vector-length v))
|
(define size (vector-length v))
|
||||||
|
@ -187,7 +198,7 @@
|
||||||
(match h
|
(match h
|
||||||
[(heap vec size <=?)
|
[(heap vec size <=?)
|
||||||
(let ([v (vector-copy vec 0 size)])
|
(let ([v (vector-copy vec 0 size)])
|
||||||
(heap-sort! <=? v)
|
(heap-sort!* v <=?)
|
||||||
v)]))
|
v)]))
|
||||||
|
|
||||||
;; --------
|
;; --------
|
||||||
|
@ -205,7 +216,7 @@
|
||||||
[heap->vector (-> heap? vector?)]
|
[heap->vector (-> heap? vector?)]
|
||||||
[heap-copy (-> heap? heap?)]
|
[heap-copy (-> heap? heap?)]
|
||||||
|
|
||||||
[heap-sort! (-> procedure? vector? void?)]
|
|
||||||
|
|
||||||
[in-heap (-> heap? sequence?)]
|
[in-heap (-> heap? sequence?)]
|
||||||
[in-heap/consume! (-> heap? sequence?)])
|
[in-heap/consume! (-> heap? sequence?)])
|
||||||
|
|
||||||
|
(provide heap-sort!)
|
||||||
|
|
|
@ -148,21 +148,6 @@ Makes a copy of heap @racket[h].
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@;{--------}
|
|
||||||
|
|
||||||
@defproc[(heap-sort! [<=? (-> any/c any/c any/c)] [v (and/c vector? (not/c immutable?))]) void?]{
|
|
||||||
|
|
||||||
Sorts vector @racket[v] using the comparison function @racket[<=?].
|
|
||||||
|
|
||||||
@examples[#:eval the-eval
|
|
||||||
(define terms (vector "batch" "deal" "flock" "good deal" "hatful" "lot"))
|
|
||||||
(heap-sort! string<=? terms)
|
|
||||||
terms
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@defproc[(in-heap/consume! [heap heap?]) sequence?]{
|
@defproc[(in-heap/consume! [heap heap?]) sequence?]{
|
||||||
Returns a sequence equivalent to @racket[heap], maintaining the heap's ordering.
|
Returns a sequence equivalent to @racket[heap], maintaining the heap's ordering.
|
||||||
The heap is consumed in the process. Equivalent to repeated calling
|
The heap is consumed in the process. Equivalent to repeated calling
|
||||||
|
@ -192,5 +177,17 @@ Equivalent to @racket[in-heap/consume!] except the heap is copied first.
|
||||||
(heap-count h)]
|
(heap-count h)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@;{--------}
|
||||||
|
|
||||||
|
@defproc[(heap-sort! [v (and/c vector? (not/c immutable?))] [<=? (-> any/c any/c any/c)]) void?]{
|
||||||
|
|
||||||
|
Sorts vector @racket[v] using the comparison function @racket[<=?].
|
||||||
|
|
||||||
|
@examples[#:eval the-eval
|
||||||
|
(define terms (vector "batch" "deal" "flock" "good deal" "hatful" "lot"))
|
||||||
|
(heap-sort! terms string<=?)
|
||||||
|
terms
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
@close-eval[the-eval]
|
@close-eval[the-eval]
|
||||||
|
|
|
@ -84,3 +84,21 @@
|
||||||
[lst (for/list ([x (in-heap/consume! h)]) x)])
|
[lst (for/list ([x (in-heap/consume! h)]) x)])
|
||||||
(heap-count h))
|
(heap-count h))
|
||||||
0)
|
0)
|
||||||
|
|
||||||
|
(test-equal? "heap-sort"
|
||||||
|
(let ([v (vector 3 4 2 5 1)])
|
||||||
|
(heap-sort! v <=)
|
||||||
|
v)
|
||||||
|
'#(1 2 3 4 5))
|
||||||
|
|
||||||
|
(test-equal? "heap-sort (old arg order)"
|
||||||
|
(let ([v (vector 3 4 2 5 1)])
|
||||||
|
(heap-sort! <= v)
|
||||||
|
v)
|
||||||
|
'#(1 2 3 4 5))
|
||||||
|
|
||||||
|
(let* ([l (for/list ([i 1000]) (random 1000))]
|
||||||
|
[v (list->vector l)])
|
||||||
|
(test-equal? "heap-sort (random)"
|
||||||
|
(begin (heap-sort! v <=) (vector->list v))
|
||||||
|
(sort l <)))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user