#[cfg(test)]
mod unit_test;
use std::collections::BinaryHeap;
use std::mem::replace;
#[derive(Debug)]
pub struct BinaryHeapSort<T> {
heap: BinaryHeap<T>,
}
impl<T: Ord> BinaryHeapSort<T> {
pub fn init(v: Vec<T>) -> Self {
Self {
heap: BinaryHeap::from(v),
}
}
pub fn into_sorted_vec(self) -> Vec<T> {
self.heap.into_sorted_vec()
}
}
#[derive(Debug)]
pub struct HeapSort<T> {
vec: Vec<T>,
}
impl<T: Default + Clone> HeapSort<T> {
pub fn init(mut v: Vec<T>) -> Self {
let mut new_vec = vec![T::default()]; new_vec.append(&mut v);
Self { vec: new_vec }
}
}
impl<T: Ord + Clone> HeapSort<T> {
fn sink(&mut self, mut k: usize, n: usize) {
while 2 * k < n {
let mut j = 2 * k;
if j < n - 1 && self.vec[j] < self.vec[j + 1] {
j += 1;
}
if self.vec[k] >= self.vec[j] {
break;
}
let val = self.vec[k].clone();
self.vec[k] = replace(&mut self.vec[j], val);
k = j;
}
}
fn sink_all(&mut self) {
let n = self.vec.len();
for j in (1..(n + 1) / 2).rev() {
let new_j = j;
self.sink(new_j, n);
}
}
fn sort_down(mut self) -> Vec<T> {
let mut n = self.vec.len();
while n > 1 {
let val = self.vec[1].clone();
self.vec[1] = replace(&mut self.vec[n - 1], val);
n -= 1;
self.sink(1, n);
}
self.vec[1..].into()
}
pub fn into_sorted_vec(mut self) -> Vec<T> {
self.sink_all(); self.sort_down() }
}