rust使用trait排序"/>
rust使用trait排序
//Sort行为... 类似go的接口, 不过感觉还是泛型在某些方面舒服,虽然代码多一点...
trait Sort {fn less(&self,a:usize, b:usize) -> bool; //大小fn len(&self) -> usize; // 长度fn swap_by_index(&mut self,a:usize, b:usize); //交换
}//vec泛型...
impl<T> Sort for Vec<T> where T:std::cmp::PartialOrd{fn less(&self,a:usize, b : usize) ->bool { &self[a] < &self[b]}fn len(&self) -> usize {self.len()}fn swap_by_index(&mut self,a:usize, b : usize) {self.swap(a,b);}
}fn sort(s : &mut Sort) {let l = s.len()-1;quick_sort_trait(s,0,l);
}
fn quick_sort_trait( arr:&mut Sort, a:usize,b : usize){if a<b {if b-a < 20 {insert_sort_Sort(arr,a,b);}else{let p = partion_trait(arr,a,b);if p != 0 {quick_sort_trait(arr,a,p-1); //无符号整数...越界}quick_sort_trait(arr,p+1,b);}}
}fn insert_sort_Sort(arr: &mut Sort,a:usize, b : usize) {let mut i:usize;for j in a+1..b+1 {i= j;while i>a&& arr.less(i,i-1) { // self.less()变成了less(&self)???arr.swap_by_index(i,i-1);i-=1;}}
}
fn partion_trait( arr :&mut Sort, p:usize,r:usize)->usize { let mut i = p;for j in p..r {if arr.less(j,r) { //注意是与主键比较arr.swap_by_index(i, j);i+=1;}}arr.swap_by_index(i,r);i
}fn main() {let mut rag = rand::thread_rng();let mut a = vec![]; //暂时不指定类型for _j in 0..10 {let tmp:u8 = rag.gen(); //产生随机数let person = Person::new(tmp); //创建结构体a.push(person);}// for i in &a { //引用, 不释放空间// println!("原始数据{:#?}",i)// }// quicksort(&mut a);sort(&mut a);for i in &a { //引用, 不释放空间println!("{:#?}",i.age);}}
更多推荐
rust使用trait排序
发布评论