diff options
author | Santo Cariotti <santo@dcariotti.me> | 2021-02-06 19:56:36 +0100 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2021-02-06 19:56:36 +0100 |
commit | d2edbc38cac8da52f58c5cd3da6c0c625fa05736 (patch) | |
tree | a51e9a4e56fc9d4c7c9e37576dceedca3a0c72b4 /Year_2 | |
parent | 98f34040820dc3a964b7be59a698323e8cc6c8a3 (diff) |
conf: rename
Diffstat (limited to 'Year_2')
-rw-r--r-- | Year_2/Algorithms/data_structures/heap.c | 95 | ||||
-rw-r--r-- | Year_2/Algorithms/data_structures/heap.rs | 115 |
2 files changed, 210 insertions, 0 deletions
diff --git a/Year_2/Algorithms/data_structures/heap.c b/Year_2/Algorithms/data_structures/heap.c new file mode 100644 index 0000000..be7024b --- /dev/null +++ b/Year_2/Algorithms/data_structures/heap.c @@ -0,0 +1,95 @@ +#include<stdio.h> +#include<stdlib.h> +#define HEAP_TYPE 0 // if 0 is max heap, else min heap + +unsigned heapsize = 0; + +int compare(int x, int y) { + return (!HEAP_TYPE) ? x < y : x > y; +} + +void swap(int* a, int x, int y) { + int temp = a[x]; + a[x] = a[y]; + a[y] = temp; +} + +void insert(int* a, int k) { + a[++heapsize] = k; + unsigned i = heapsize; + + while(i > 1 && compare(a[i>>1], a[i])) { + swap(a, i, i >> 1); + i >>= 1; + } +} + +void heapify(int* a, int n, int i) { + int l = i << 1; + int r = l | 1; + + int max = i; + if(l <= n && !compare(a[l], a[max])) max = l; + if(r <= n && !compare(a[r], a[max])) max = r; + + if(max != i) { + swap(a, i, max); + heapify(a, n, max); + } +} + +void build(int* a, int n) { + for(unsigned i = n/2; i > 0; --i) { + heapify(a, n, i); + } +} + +int extract(int* a) { + swap(a, 1, heapsize); + --heapsize; + heapify(a, heapsize, 1); + return *(a+heapsize+1); +} + +int* heapsort(int* a, int n) { + int* b = malloc(sizeof(int) * n); + build(a, n); + for(unsigned i = n-1; i != -1; --i) { + b[i] = extract(a); + } + + return b; +} + +void increase_key(int* a, int i, int k) { + swap(a, i, k); + while(i > 1 && compare(a[i>>1], a[i])) { + swap(a, i, i >> 1); + i >>= 1; + } +} + +int main() { + heapsize = 0; + int* a = malloc(sizeof(int) * 7); + + insert(a, 5); + insert(a, 24); + insert(a, 1); + insert(a, 12); + insert(a, 35); + insert(a, -1); + + printf("heap = "); + for(unsigned i = 1; i <= heapsize; ++i) + printf("%d ", *(a+i)); + + int n = heapsize; + int* b = heapsort(a, heapsize); + printf("\nheapsort = "); + for(unsigned i = 0; i < n; ++i) + printf("%d ", *(b+i)); + free(b); + free(a); + return 0; +} diff --git a/Year_2/Algorithms/data_structures/heap.rs b/Year_2/Algorithms/data_structures/heap.rs new file mode 100644 index 0000000..9dde55c --- /dev/null +++ b/Year_2/Algorithms/data_structures/heap.rs @@ -0,0 +1,115 @@ +struct Heap<T> { + array: [T; 32], + is_minheap: bool, + size: usize, +} + +impl<T> Heap<T> +where + T: PartialOrd + Copy + Default, +{ + fn new() -> Self { + Heap { + array: [T::default(); 32], + is_minheap: false, + size: 0, + } + } + + fn insert(&mut self, k: T) { + self.size += 1; + self.array[self.size] = k; + let mut i = self.size; + + while i > 1 && self.compare(i >> 1, i) { + let temp = self.array[i]; + self.array[i] = self.array[i >> 1]; + self.array[i >> 1] = temp; + i >>= 1; + } + } + + fn heapify(&mut self, i: usize) { + let l = i << 1; + let r = l | 1; + + let mut max = i; + if l <= self.size && !self.compare(l, max) { + max = l; + } + if r <= self.size && !self.compare(r, max) { + max = r; + } + + if max != i { + let temp = self.array[i]; + self.array[i] = self.array[max]; + self.array[max] = temp; + self.heapify(max); + } + } + + fn extract(&mut self) -> T { + let temp = self.array[1]; + self.array[1] = self.array[self.size]; + self.array[self.size] = temp; + self.size -= 1; + + self.heapify(1); + + self.array[self.size + 1] + } + + fn compare(&self, x: usize, y: usize) -> bool { + match self.is_minheap { + false => self.array[x] < self.array[y], + true => self.array[x] > self.array[y], + } + } +} + +fn build<T: PartialOrd + Copy + Default>(array: [T; 32], n: usize) -> Heap<T> { + let mut heap = Heap::<T>::new(); + + heap.size = n; + heap.array = array; + + for i in (1..=n / 2).rev() { + heap.heapify(i); + } + + heap +} + +fn heapsort<T: PartialOrd + Copy + Default>(array: [T; 32], n: usize) -> [T; 32] { + let mut heap = build(array, n); + let mut arr: [T; 32] = [T::default(); 32]; + for i in (0..n).rev() { + arr[i] = heap.extract(); + } + + arr +} + +fn main() { + let mut h = Heap::<i32>::new(); + println!("{:?}", h.array); + h.insert(5); + h.insert(24); + h.insert(1); + h.insert(12); + h.insert(35); + h.insert(-1); + println!("{:?}\n", h.array); + + let mut arr: [i32; 32] = [0; 32]; + arr[1] = 5; + arr[2] = 24; + arr[3] = 1; + arr[4] = 12; + arr[5] = 35; + arr[6] = -1; + println!("{:?}", &arr); + let hh = heapsort(arr, 6); + println!("{:?}", hh); +} |