Advertisement
Guest User

kopce LEWICOWE

a guest
Mar 20th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define (inc n)
  4. (+ n 1))
  5.  
  6. ;;; tagged lists
  7. (define (tagged-list? len-xs tag xs)
  8. (and (list? xs)
  9. (= len-xs (length xs))
  10. (eq? (first xs) tag)))
  11.  
  12. ;;; ordered elements
  13. (define (make-elem pri val)
  14. (cons pri val))
  15.  
  16. (define (elem-priority x)
  17. (car x))
  18.  
  19. (define (elem-val x)
  20. (cdr x))
  21.  
  22. ;;; leftist heaps (after Okasaki)
  23.  
  24. ;; data representation
  25. (define leaf 'leaf)
  26.  
  27. (define (leaf? h) (eq? 'leaf h))
  28.  
  29. (define (hnode? h)
  30. (and (tagged-list? 5 'hnode h)
  31. (natural? (caddr h))))
  32.  
  33. (define (make-hnode elem heap-a heap-b)
  34. (let* ((p (if (< (hnode-rank heap-a) (hnode-rank heap-b))
  35. (cons heap-a heap-b)
  36. (cons heap-b heap-a)))
  37. (small (car p))
  38. (big (cdr p)))
  39. (list 'hnode elem (+ (hnode-rank small) 1) big small)))
  40.  
  41. (define (hnode-elem h)
  42. (second h))
  43.  
  44. (define (hnode-left h)
  45. (fourth h))
  46.  
  47. (define (hnode-right h)
  48. (fifth h))
  49.  
  50. (define (hnode-rank h)
  51. (third h))
  52.  
  53. (define (hord? p h)
  54. (or (leaf? h)
  55. (<= p (elem-priority (hnode-elem h)))))
  56.  
  57. (define (heap? h)
  58. (or (leaf? h)
  59. (and (hnode? h)
  60. (heap? (hnode-left h))
  61. (heap? (hnode-right h))
  62. (<= (rank (hnode-right h))
  63. (rank (hnode-left h)))
  64. (= (rank h) (inc (rank (hnode-right h))))
  65. (hord? (elem-priority (hnode-elem h))
  66. (hnode-left h))
  67. (hord? (elem-priority (hnode-elem h))
  68. (hnode-right h)))))
  69.  
  70. (define (rank h)
  71. (if (leaf? h)
  72. 0
  73. (hnode-rank h)))
  74.  
  75. ;; operations
  76.  
  77. (define empty-heap leaf)
  78.  
  79. (define (heap-empty? h)
  80. (leaf? h))
  81.  
  82. (define (heap-insert elt heap)
  83. (heap-merge heap (make-hnode elt leaf leaf)))
  84.  
  85. (define (heap-min heap)
  86. (hnode-elem heap))
  87.  
  88. (define (heap-pop heap)
  89. (heap-merge (hnode-left heap) (hnode-right heap)))
  90.  
  91. (define (heap-merge h1 h2)
  92. (cond
  93. [(leaf? h1) h2]
  94. [(leaf? h2) h1]
  95. [else
  96. ]))
  97.  
  98.  
  99. ;;; heapsort. sorts a list of numbers.
  100. (define (heapsort xs)
  101. (define (popAll h)
  102. (if (heap-empty? h)
  103. null
  104. (cons (elem-val (heap-min h)) (popAll (heap-pop h)))))
  105. (let ((h (foldl (lambda (x h)
  106. (heap-insert (make-elem x x) h))
  107. empty-heap xs)))
  108. (popAll h)))
  109.  
  110. ;;; check that a list is sorted (useful for longish lists)
  111. (define (sorted? xs)
  112. (cond [(null? xs) true]
  113. [(null? (cdr xs)) true]
  114. [(<= (car xs) (cadr xs)) (sorted? (cdr xs))]
  115. [else false]))
  116.  
  117. ;;; generate a list of random numbers of a given length
  118. (define (randlist len max)
  119. (define (aux len lst)
  120. (if (= len 0)
  121. lst
  122. (aux (- len 1) (cons (random max) lst))))
  123. (aux len null))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement