スポンサーリンク
Rustのスライスを使ってみたくて書いた。
クイックソートを書いたのはたぶん15年ぶりくらい。正直てこずった。
fn my_qsort_slice(data: &mut [i32]){ if data.len() <= 1{ return; } // ピボットを求める let pivot =data[data.len()/2]; let idmin:i32 = 0; let idmax:i32 = (data.len()-1) as i32; ////////////////////////////////////////////////// // ピボットより小さいものを左に、大きいものを右に分ける let mut l =idmin; // 左側の探索位置。pivotより大きい値を探す let mut r =idmax; // 右側の探索位置。pivot未満の値を探す loop{ // 左側の交換すべき値を探す while data[l as usize] < pivot { l += 1; } // 右側の交換すべき値を探す while data[r as usize] > pivot { r -= 1; } if l >= r{ break; } // 交換 let tmp = data[l as usize]; data[l as usize] = data[r as usize]; data[r as usize] = tmp;
l += 1;
r -= 1; } { // 左側のスライスを作成 let mut left = &mut data[0..l as usize]; // 左側のスライスを再帰的にソート my_qsort_slice(&mut left); } { // 右側のスライスを作成 let mut right = &mut data[ (r+1) as usize ..]; // 右側のスライスを再帰的にソート my_qsort_slice(&mut right); } }
fn my_qsort(data : &mut Vec<i32>){ my_qsort_slice(&mut data[..]); }
fn main() { let mut data:Vec<i32> = Vec::new(); data = [8,1,9,2,4,6].to_vec(); my_qsort(&mut data); for i in 0..data.len(){ println!("{}",data[i]); } println!("Hello, world!"); }