2017-06-17 15 views
1

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 
} 

私はエラーを取得する:

thread 'main' panicked at 'attempt to subtract with overflow', insertion_sort.rs:12 
note: Run with `RUST_BACKTRACE=1` for a backtrace 

なぜオーバーフローはここで起きず、どのような問題が軽減されますか?

+0

@SpencerWieczorekが、同じ正確なコードは、同じ入力 – atomsmasher

+1

'i'はそれがusize'、つまり'型を持つと、Pythonで実行しているようですしたがって、条件 'i> = 0'は常に真です。さらに、Rustには、負のインデックスを許可するPythonの機能はありません。 – red75prime

+0

['slide :: sort'](https://doc.rust-lang.org/std/primitive.slice.html#method.sort)を使ってみませんか? – Stargateur

答えて

2

0 - 1usizeタイプで計算しようとしましたが、これは符号なし(非負)です。これは、Rustのエラーにつながる可能性があります。

なぜusize? Rustは長さとインデックスについてusizeを期待しているからです。あなたは明示的にそれらを符号付きのものに/から変換することができます。 isize

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() as isize { 
     let key = A[j as usize]; 
     let mut i = j - 1; 
     while (i >= 0) && (A[i as usize] > key) { 
      A[(i + 1) as usize] = A[i as usize]; 
      i = i - 1; 
     } 
     A[(i + 1) as usize] = key; 
    } 
    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 
} 
関連する問題