スポンサーリンク

Rustでクイックソートを書いてみる

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!");
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: