Rust 插入排序算法产生溢出错误

Rust 插入排序算法产生溢出错误,rust,overflow,Rust,Overflow,当尝试运行插入排序算法时,如Rust 1.15所示 fn main() { println!("The sorted set is now: {:?}", insertion_sort(vec![5,2,4,6,1,3])); } fn insertion_sort(set: Vec<i32>) -> Vec<i32> { let mut A = set.to_vec(); for j in 1..set.len() { l

当尝试运行插入排序算法时,如Rust 1.15所示

fn main() {
    println!("The sorted set is now: {:?}", insertion_sort(vec![5,2,4,6,1,3]));
}

fn insertion_sort(set: Vec<i32>) -> Vec<i32> {
    let mut A = set.to_vec();
    for j in 1..set.len() {
        let key = A[j];
        let mut i = j - 1;
        while (i >= 0) && (A[i] > key) {
            A[i + 1] = A[i];
            i = i - 1;
        }
        A[i + 1] = key;
    }
    A
}

为什么这里会发生溢流?如何缓解该问题

原因是您试图在
usize
类型中计算
0-1
,该类型为无符号(非负)。这可能导致生锈错误

为什么使用?因为Rust希望
使用长度和索引。您可以显式地将它们转换为或转换为有符号的,例如,
isize

fn main(){
println!(“排序集现在是:{:?}”,插入排序(vec![5,2,4,6,1,3]);
}
fn插入\排序(集合:Vec)->Vec{
设mut A=set.to_vec();
对于1..set.len()中的j,将其设置为isize{
设key=A[j as usize];
设muti=j-1;
而(i>=0)和(A[i as usize]>键){
A[(i+1)as usize]=A[i as usize];
i=i-1;
}
A[(i+1)as usize]=键;
}
A.
}
我建议的另一个解决方案是完全避免负指数。在这种情况下,您可以使用
i+1
代替
i
,如下所示:

fn main() {
    println!("The sorted set is now: {:?}", insertion_sort(vec![5,2,4,6,1,3]));
}

fn insertion_sort(set: Vec<i32>) -> Vec<i32> {
    let mut A = set.to_vec();
    for j in 1..set.len() {
        let key = A[j];
        let mut i = j;
        while (i > 0) && (A[i - 1] > key) {
            A[i] = A[i - 1];
            i = i - 1;
        }
        A[i] = key;
    }
    A
}
fn main(){
println!(“排序集现在是:{:?}”,插入排序(vec![5,2,4,6,1,3]);
}
fn插入\排序(集合:Vec)->Vec{
设mut A=set.to_vec();
对于1..set.len()中的j{
设key=A[j];
设muti=j;
而(i>0)和(A[i-1]>键){
A[i]=A[i-1];
i=i-1;
}
A[i]=键;
}
A.
}

@SpencerWieczorek但同样的代码似乎在python中运行,使用相同的输入
i
具有类型
usize
,即它是无符号的,因此条件
i>=0
始终为真。此外,Rust没有python允许负索引的特性。为什么不使用?另请参见,