z66is

scheme language bottom up mergesort code

Jul 5th, 2025 (edited)
4,656
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 3.60 KB | Source Code | 0 0
  1. ;; ============================================================
  2. ;; Basic wrappers for primitive operations
  3. ;; ============================================================
  4.  
  5. ;; Append two lists
  6. (define (append* list1 list2)
  7.   ;; Equivalent to built-in append
  8.   (append list1 list2))
  9.  
  10. ;; Car of a pair
  11. (define (car* list1)
  12.   ;; Equivalent to built-in car
  13.   (car list1))
  14.  
  15. ;; Cdr of a pair
  16. (define (cdr* list1)
  17.   ;; Equivalent to built-in cdr
  18.   (cdr list1))
  19.  
  20. ;; Cons an item onto a list
  21. (define (cons* item list1)
  22.   ;; Equivalent to built-in cons
  23.   (cons item list1))
  24.  
  25. ;; singleton List
  26. (define (list1* value)
  27.   ;; Equivalent to built-in list
  28.   (list value))
  29.  
  30. ;; Map a function over a list
  31. (define (map* function list1)
  32.   ;; Equivalent to built-in map
  33.   (map function list1))
  34.  
  35. ;; Null? predicate
  36. (define (null?* value)
  37.   ;; Equivalent to built-in null?
  38.   (null? value))
  39.  
  40. ;; Reverse a list
  41. (define (reverse* list1)
  42.   ;; Equivalent to built-in reverse
  43.   (reverse list1))
  44.  
  45.  
  46. ;; ============================================================
  47. ;; Merge procedure
  48. ;; ============================================================
  49.  
  50. ;; Public entry point: merge two sorted lists with a comparator
  51. (define (merge comparator list1 list2)
  52.   ;; Start with an empty collector
  53.   (merge01 comparator list1 list2 '()))
  54.  
  55. ;; Internal merge with accumulator (collect)
  56. (define (merge01 comparator list1 list2 collect)
  57.   (cond
  58.     ;; Case 1: list2 exhausted → append reversed collect with list1
  59.     ((null?* list2)
  60.      (append* (reverse* collect) list1))
  61.  
  62.     ;; Case 2: list1 exhausted → append reversed collect with list2
  63.     ((null?* list1)
  64.      (append* (reverse* collect) list2))
  65.  
  66.     ;; Case 3: comparator prefers element from list2
  67.     ((comparator (car* list2) (car* list1))
  68.      (merge01 comparator
  69.               list1
  70.               (cdr* list2)
  71.               (cons* (car* list2) collect)))
  72.  
  73.     ;; Case 4: otherwise take from list1 (stability priority)
  74.     (else
  75.      (merge01 comparator
  76.               (cdr* list1)
  77.               list2
  78.               (cons* (car* list1) collect)))))
  79.  
  80.  
  81. ;; ============================================================
  82. ;; Sort procedure (merge sort)
  83. ;; ============================================================
  84.  
  85. ;; Public entry point: prepare jumble and perform merge passes
  86. (define (sort* comparator jumble)
  87.   (sort03 comparator
  88.           (sort02 comparator
  89.                   (sort01 jumble))))
  90.  
  91. ;; Step 1: prepare jumble by wrapping each element in a list
  92. (define (sort01 jumble)
  93.   (map* list1* jumble))
  94.  
  95. ;; Step 2: perform a single merge pass
  96. (define (sort02 comparator jumble)
  97.   (cond
  98.     ;; Empty jumble → return nil
  99.     ((null?* jumble) '())
  100.  
  101.     ;; One list in jumble → return it
  102.     ((null?* (cdr* jumble)) jumble)
  103.  
  104.     ;; Otherwise merge first two lists, recurse on rest
  105.     (else
  106.      (cons* (merge comparator (car* jumble) (car* (cdr* jumble)))
  107.             (sort02 comparator (cdr* (cdr* jumble)))))))
  108.  
  109. ;; Step 3: repeat merge passes until fully sorted
  110. (define (sort03 comparator jumble)
  111.   (cond
  112.     ;; Empty jumble
  113.     ((null?* jumble) '())
  114.  
  115.     ;; One list left → return it
  116.     ((null?* (cdr* jumble)) (car* jumble))
  117.  
  118.     ;; Otherwise perform another merge pass
  119.     (else
  120.      (sort03 comparator (sort02 comparator jumble)))))
  121.  
  122.  
  123. ;; ============================================================
  124. ;; Main entry point
  125. ;; ============================================================
  126.  
  127. (define (main)
  128.   ;; Example: sort numbers with ">" comparator
  129.   (display (sort* > (list 4 3 5 6 8 7 1 2 9)))
  130.   (newline))
  131.  
  132. ;; Run main
  133. (main)
Advertisement