原创,转载请说明!谢谢
由于rust中自带的排序函数适用于一次或多次(次数较少)排序,对于每次来的新元素插入到vec中,再对此排序可以先通过一些内置函数(参见https://magiclen.org/sorted-insert/)进行下标的查询,然后再插入,否则每次新来的元素再对其整个vec进行排序的资源消耗太大(尤其是数组较大时)。
思路: 如果保持顺序递增的话,可以先使用二分查找binary_search()函数进行下标的查找,再利用insert函数进行数据的插入(前提是,该vec本身就是有序的,或者是空的vec)。
但是rust库没有提供如何对一个逆序的vec或者初始为空—目标为逆序vec,进行数据的插入。所以只能自己来写一些列的函数。
相关函数参见官方文档:https://doc.rust-lang.org/stable/src/core/slice/mod.rs.html
使用场景:对一个vec进行逆序的排序,以及对新元素插入该vec中,插入后仍然保持逆序
找vec下标的代码如下:
记录一下自己写的逆序二分查找下标的函数
fn binarySearch_reverse(x : &Vec<usize>,y:usize) -> usize {
let mut left:usize = 0;
let mut right:usize = x.len();
//println!("test\n{:?}",right);
while left < right {
let mid:usize = left + (right - left) / 2;
let temp:usize = x[mid];
if y == temp {
return mid;
} else if y > temp {
right = mid;
} else{
left = mid+1;
}
}
right
}
对于插入的目标,只需要先通过上述函数查找插入的index,之后再利用insert函数,插入即可。
举例代码如下:
fn main(){
let mut v : Vec<usize> = vec![];
//插入元素2、4、1、5
let index1:usize = binarySearch_reverse(&v,2);
v.insert(index1, 2);
let index2:usize = binarySearch_reverse(&v,4);
v.insert(index2, 4);
let index3:usize = binarySearch_reverse(&v,1);
v.insert(index3, 1);
let index4:usize = binarySearch_reverse(&v,5);
v.insert(index4, 5);
println!("{:?}",v);//打印结果:[5, 4, 2, 1]
}
至此,可以通过上述函数,先查找index下标,再利用insert()函数插入元素,提高性能。