Sorting algorithms/Radix sort: Difference between revisions

Line 3,521:
 
 
The following implementation doesconverts notsigned supportintegers numbersto ofa arbitrarylexicographically ordered representation magnitude(specifically, butunsigned itnumbers ''does''in workthe bycorrect convertingorder). signedIt integersthen tosorts athe lexicographically ordered representation, thenand finally converts revertingback to the original representation.
 
<lang Scheme>;;; An illustrative implementation of the radix-10 example at
Line 3,532:
(import (scheme base))
(import (scheme write))
 
(define *max-magnitude* (make-parameter 999999))
 
(define (nines-complement x)
(let ((nines (+ (* 10 (*max-magnitude*)) 9)))
(- nines x)))
 
(define (sort-by-decimal-digit data power-of-10)
Line 3,565 ⟶ 3,559:
 
(define (radix-sort data)
(define max-magnitudeoffset (*max-magnitude*)0)
 
(do ((i 0 (+ i 1)))
((<= i (vector-length data) i))
(let ((x (vector-ref data i)))
(ifwhen (negative? x)
(vector-set! dataoffset i(max offset (+- x max-magnitude))))))
 
(vector-set! data i (nines-complement
(do ((i 0 (+ i 1)))
(- max-magnitude x))))))
((= i (vector-set!length data i (- x max-magnitude)))
(vector-set! data i (nines+ (vector-complementref data i) offset)))
 
(let loop ((power-of-10 1))
(let ((done (sort-by-decimal-digit data power-of-10)))
(unless done
(loop (* 10 power-of-10)))))
 
(do ((i 0 (+ i 1)))
((= i (vector-length data)))
(let ((x (vector-ref data i)))
(vector-set! data i (- max(vector-magnituderef data i) offset)))))
(if (<= x max-magnitude)
(vector-set! data i (- x max-magnitude))
(vector-set! data i (- max-magnitude
(nines-complement x)))))))
 
(define data (vector-copy #(170 45 75 90 2 802 2 66)))
1,448

edits