Add 7-1
This commit is contained in:
parent
8aba9a3d64
commit
8cfe7b7d69
108
semester3/pset3/7-1-Binary-Heap.c
Normal file
108
semester3/pset3/7-1-Binary-Heap.c
Normal file
|
@ -0,0 +1,108 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct heap {
|
||||
int* arr;
|
||||
int capacity;
|
||||
int size;
|
||||
} heap;
|
||||
|
||||
heap* newHeap(int size) {
|
||||
heap* new = malloc(sizeof(heap));
|
||||
|
||||
new->arr = malloc(sizeof(int) * size);
|
||||
|
||||
new->size = 0;
|
||||
new->capacity = size;
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
void swap(int* l, int* r) {
|
||||
int tmp = *r;
|
||||
*r = *l;
|
||||
*l = tmp;
|
||||
}
|
||||
|
||||
int max(int l, int r) {
|
||||
return (l > r) ? l : r;
|
||||
}
|
||||
|
||||
int parent(int i) {
|
||||
return (i - 1) / 2;
|
||||
}
|
||||
|
||||
int left (int i) {
|
||||
return i * 2 + 1;
|
||||
}
|
||||
|
||||
int right (int i) {
|
||||
return i * 2 + 2;
|
||||
}
|
||||
|
||||
void insert(heap* h, int val) {
|
||||
int i = h->size++;
|
||||
|
||||
h->arr[i] = val;
|
||||
|
||||
while (i != 0 && h->arr[i] < h->arr[parent(i)]) {
|
||||
swap(&h->arr[i], &h->arr[parent(i)]);
|
||||
i = parent(i);
|
||||
}
|
||||
}
|
||||
|
||||
void heapify(heap * h, int i) {
|
||||
int smallest = i;
|
||||
int l = left(i);
|
||||
int r = right(i);
|
||||
|
||||
// comparing size is important!
|
||||
if (l < h->size && h->arr[smallest] > h->arr[l]) {
|
||||
smallest = l;
|
||||
}
|
||||
if (r < h->size && h->arr[smallest] > h->arr[r]) {
|
||||
smallest = r;
|
||||
}
|
||||
|
||||
if (smallest != i) {
|
||||
swap(&h->arr[smallest], &h->arr[i]);
|
||||
heapify(h, smallest);
|
||||
}
|
||||
}
|
||||
|
||||
void buildHeap(heap* h) {
|
||||
int start = h->size / 2 - 1;
|
||||
|
||||
while (start >= 0) {
|
||||
heapify(h, start--);
|
||||
}
|
||||
}
|
||||
|
||||
void print(int* array, int size) {
|
||||
for (int i = 0; i < size - 1; i++) {
|
||||
printf("%d,", array[i]);
|
||||
}
|
||||
printf("%d\n", array[size - 1]);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
int size;
|
||||
scanf("%d", &size);
|
||||
|
||||
int tmp;
|
||||
heap* h1 = newHeap(size);
|
||||
heap* h2 = newHeap(size);
|
||||
h2->size = size;
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
scanf("%d,", &tmp);
|
||||
h2->arr[i] = tmp;
|
||||
insert(h1, tmp);
|
||||
}
|
||||
|
||||
buildHeap(h2);
|
||||
print(h1->arr, size);
|
||||
print(h2->arr, size);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue