Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #lang racket
  2. (require racklog)
  3.  
  4. (define %rev
  5. (%rel (x xs ys acc)
  6. [(null acc acc)]
  7. [(xs ys)
  8. (%rev xs ys null)]
  9. [((cons x xs) ys acc)
  10. (%rev xs ys (cons x acc))]))
  11.  
  12. (define %my-app
  13. (%rel (x xs ys zs)
  14. [(null ys ys)]
  15. [((cons x xs) ys (cons x zs))
  16. (%my-app xs ys zs)]))
  17.  
  18. (define %merge
  19. (%rel (x xs y ys zs zst)
  20. [(null ys ys)]
  21. [(xs null xs)]
  22. [((cons x xs) (cons y ys) (cons y zs))
  23. (%> x y)
  24. (%merge (cons x xs) ys zs)]
  25. [((cons x xs) (cons y ys) (cons x zs))
  26. (%<= x y)
  27. (%merge xs (cons y ys) zs)]))
  28.  
  29. (define %len
  30. (%rel (x xs n m)
  31. [(null 0)]
  32. [((cons x xs) m)
  33. (%len xs n)
  34. (%is m (+ n 1))]))
  35.  
  36. (define %split
  37. (%rel (x xs ys zs acc m n tmp)
  38. [(xs ys zs)
  39. (%len xs n)
  40. (%is m (/ n 2))
  41. (%split xs ys zs null m)]
  42. [((cons x xs) ys zs acc n)
  43. (%len acc m)
  44. (%< m n)
  45. (%my-app acc (cons x null) tmp)
  46. (%split xs ys zs tmp n)]
  47. [(xs acc xs acc n)
  48. (%len acc m)
  49. (%>= m n)]))
  50.  
  51. (define %mergesort
  52. (%rel (xs ys n s1 s2 ms1 ms2)
  53. [(xs xs)
  54. (%len xs n)
  55. (%<= n 1)]
  56. [(xs ys)
  57. (%len xs n)
  58. (%> n 1)
  59. (%split xs s1 s2)
  60. (%mergesort s1 ms1)
  61. (%mergesort s2 ms2)
  62. (%merge ms1 ms2 ys)]))
  63.  
  64. (define (merge xs ys)
  65. (cond
  66. [(null? xs) ys]
  67. [(null? ys) xs]
  68. [(< (car xs) (car ys)) (cons (car xs) (merge (cdr xs) ys))]
  69. [else (cons (car ys) (merge xs (cdr ys)))]))
  70.  
  71. (define (split xs)
  72. (define (iter xs acc n)
  73. (if (< (length acc) n)
  74. (iter (cdr xs) (append acc (list (car xs))) n)
  75. (cons acc xs)))
  76. (iter xs null (/ (length xs) 2)))
  77.  
  78. (define (mergesort xs)
  79. (if (= (length xs) 1)
  80. xs
  81. (merge (mergesort (car (split xs)))
  82. (mergesort (cdr (split xs))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement