Skip to content

Instantly share code, notes, and snippets.

@Mroik
Created September 23, 2022 23:55
Show Gist options
  • Save Mroik/0ba69e709bf45e0c005088837a503fb9 to your computer and use it in GitHub Desktop.
Save Mroik/0ba69e709bf45e0c005088837a503fb9 to your computer and use it in GitHub Desktop.
struct Heap {
data: Vec<i32>
}
impl Heap {
fn from(arr: &[i32]) -> Heap {
let mut h = Heap { data: Vec::from(arr)};
h.make();
return h;
}
fn sift_down(&mut self, x: usize) {
let mut i = x;
let mut l;
let mut r;
let mut greater = i;
while i < self.data.len() {
l = i * 2 + 1;
r = i * 2 + 2;
if l >= self.data.len() {
break;
}
if self.data[i] < self.data[l] {
greater = l;
}
if r < self.data.len() && self.data[greater] < self.data[r] {
greater = r;
}
if greater == i {
break;
}
let temp = self.data[greater];
self.data[greater] = self.data[i];
self.data[i] = temp;
i = greater;
}
}
fn make(&mut self) {
for x in (0..self.data.len()).rev() {
self.sift_down(x);
}
}
fn pop(&mut self) -> i32 {
let ris = self.data[0];
self.data[0] = self.data[self.data.len() - 1];
self.data.pop();
self.sift_down(0);
return ris;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment