rust中对vec使用二分插入一个逆序数组的函数写法

原创,转载请说明!谢谢
由于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()函数插入元素,提高性能

你可能感兴趣的:(rust,开发语言,后端)