Advertisement
Guest User

Untitled

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