use std::cmp::Ordering;
use std::fmt::Debug;
trait Bubble<T> {
fn bsort_by<F>(&mut self, compare: F) where F: Fn(&T, &T) -> Ordering;
fn bsort(&mut self) where T: Ord;
}
impl<T> Bubble<T> for Vec<T> {
fn bsort_by<F>(&mut self, compare: F) where F: Fn(&T, &T) -> Ordering {
for i in 0..self.len() {
for j in (i + 1..self.len()).rev() {
if compare(&self[j - 1], &self[j]) == Ordering::Greater {
self.swap(j - 1, j);
}
}
}
}
fn bsort(&mut self) where T: Ord {
self.bsort_by(|a, b| a.cmp(b));
}
}
fn p<T: Debug>(x: &T) {
println!("{:?}", x);
}
fn f432<T: Debug + Ord>(v: &mut Vec<T>) {
p(v); v.bsort(); p(v);
}
fn main() {
f432(&mut vec![3, 2, 1, 0]);
f432(&mut vec!['z', 'y', 'x', 'w']);
}
dXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKdXNlIHN0ZDo6Zm10OjpEZWJ1ZzsKdHJhaXQgQnViYmxlPFQ+IHsKICAgIGZuIGJzb3J0X2J5PEY+KCZtdXQgc2VsZiwgY29tcGFyZTogRikgd2hlcmUgRjogRm4oJlQsICZUKSAtPiBPcmRlcmluZzsKICAgIGZuIGJzb3J0KCZtdXQgc2VsZikgd2hlcmUgVDogT3JkOwp9CmltcGw8VD4gQnViYmxlPFQ+IGZvciBWZWM8VD4gewogICAgZm4gYnNvcnRfYnk8Rj4oJm11dCBzZWxmLCBjb21wYXJlOiBGKSB3aGVyZSBGOiBGbigmVCwgJlQpIC0+IE9yZGVyaW5nIHsKICAgICAgICBmb3IgaSBpbiAwLi5zZWxmLmxlbigpIHsKICAgICAgICAgICAgZm9yIGogaW4gKGkgKyAxLi5zZWxmLmxlbigpKS5yZXYoKSB7CiAgICAgICAgICAgICAgICBpZiBjb21wYXJlKCZzZWxmW2ogLSAxXSwgJnNlbGZbal0pID09IE9yZGVyaW5nOjpHcmVhdGVyIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnN3YXAoaiAtIDEsIGopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm4gYnNvcnQoJm11dCBzZWxmKSB3aGVyZSBUOiBPcmQgewogICAgICAgIHNlbGYuYnNvcnRfYnkofGEsIGJ8IGEuY21wKGIpKTsKICAgIH0KfQpmbiBwPFQ6IERlYnVnPih4OiAmVCkgewogICAgcHJpbnRsbiEoIns6P30iLCB4KTsKfQpmbiBmNDMyPFQ6IERlYnVnICsgT3JkPih2OiAmbXV0IFZlYzxUPikgewogICAgcCh2KTsgdi5ic29ydCgpOyBwKHYpOwp9CmZuIG1haW4oKSB7CiAgICBmNDMyKCZtdXQgdmVjIVszLCAyLCAxLCAwXSk7CiAgICBmNDMyKCZtdXQgdmVjIVsneicsICd5JywgJ3gnLCAndyddKTsKfQ==
[3, 2, 1, 0]
[0, 1, 2, 3]
['z', 'y', 'x', 'w']
['w', 'x', 'y', 'z']