Rust 插入排序算法产生溢出错误
当尝试运行插入排序算法时,如Rust 1.15所示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
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允许负索引的特性。为什么不使用?另请参见,