Advertisement
Guest User

Untitled

a guest
Jan 24th, 2020
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5.  
  6. #include "introprog_heap.h"
  7.  
  8. /* Reserviere Speicher für einen Heap
  9. *
  10. * Der Heap soll dabei Platz für capacity Elemente bieten.
  11. *
  12. * Um konsistent mit den Parametern für malloc zu sein, ist
  13. * capacity als size_t (entspricht unsigned long auf x86/64)
  14. * deklariert.
  15. * Da es sauberer ist, sind auch alle Indizes in dieser Aufgabe
  16. * als size_t deklariert. Ob man size_t oder int als Index für
  17. * ein Array verwendet, macht in der Praxis (auf x86/64) nur
  18. * bei Arrays mit mehr als 2.147.483.647 Elementen einen
  19. * Unterschied.
  20. */
  21. heap* heap_create(size_t capacity) {
  22.  
  23. int array[capacity];
  24. heap* h = (heap*)malloc((2+capacity)*sizeof(int));
  25. h->elements = array;
  26. h->size = 0;
  27. h->capacity = capacity;
  28. return h;
  29. }
  30.  
  31. /* Stellt die Heap Bedingung an Index i wieder her
  32. *
  33. * Vorraussetzung: Der linke und rechte Unterbaum von i
  34. * erfüllen die Heap-Bedingung bereits.
  35. */
  36. void heapify(heap* h, size_t i) {
  37.  
  38. int biggest = i;
  39. int leftc = 2*i;
  40. int rightc = 2*i+1;
  41.  
  42. if(leftc <= h->size && h->elements[leftc] > h->elements[biggest]){
  43. biggest = leftc;
  44. }
  45. if(rightc<= h->size && h->elements[rightc] > h->elements[biggest]){
  46. biggest = rightc;
  47. }
  48. if(biggest != i){
  49. int temp = biggest;
  50. h->elements[biggest] = h->elements[i];
  51. h->elements[i] = h->elements[temp];
  52. heapify(h, biggest);
  53. }
  54. }
  55.  
  56.  
  57.  
  58.  
  59.  
  60. /* Holt einen Wert aus dem Heap
  61. *
  62. * Wenn der Heap nicht leer ist, wird die größte Zahl
  63. * zurückgegeben. Wenn der Heap leer ist, wird -1 zurückgegeben.
  64. */
  65. int heap_extract_max(heap* h) {
  66.  
  67. if(h->size <= 0){
  68. return -1;
  69. }
  70. int max = h->elements[0];
  71. h->elements[0] = h->elements[h->size];
  72. h->size = h->size-1;
  73. heapify(h, h->elements[0]);
  74. return max;
  75. }
  76.  
  77. /* Fügt einen Wert in den Heap ein
  78. *
  79. * Wenn der Heap bereits voll ist, wird -1 zurückgegeben.
  80. */
  81. int heap_insert(heap* h, int key) {
  82.  
  83. h->size = h->size+1;
  84. int i = h->size;
  85. int j = h->size;
  86. if(h->size%2==1){
  87. j--;
  88. }
  89. while(i > 1 && h->elements[j/2] < i){
  90. h->elements[i] = h->elements[j/2];
  91. i = j/2;
  92. }
  93. h->elements[i] = key;
  94. return h->elements[i];
  95. }
  96.  
  97. /* Gibt den Speicher von einem Heap wieder frei
  98. */
  99. void heap_free(heap* h) {
  100. free(h);
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement