MTDK1

バブルソート

バブルソート

目次:プログラミング学習


与えられた配列を昇順、降順で並べ替えます。

コード

1
2
3
4
5
6
7
8
9
10
11
fn bubble_sort(vec: &mut Vec<u32>) {
    for i in (1..vec.len()).rev() {     // -----   Loop 1
        for j in 1..=i {                // Loop 2 
            if vec[j] < vec[j - 1] {    
                let tmp = vec[j - 1];   
                vec[j - 1] = vec[j];    
                vec[j] = tmp;           
            }                           
        }                               // Loop 2   
    }                                   // -----   Loop 1
}

5, 0, 2, 1, 3, 4 6個の値をバブルソートに与える。

Fig.2

Loop 1 の (2..vec.len()).rev() は [5, 4, 3, 2, 1] です。

1回目

Fig.3

赤枠は Loop 2 の j が変化するごとに右に移動します。赤枠にある条件式が成立する場合は中身を入れ替えます。

Fig.1

一番右、i = 5 の値が最大値となりました。

2回目

Fig.4

Loop 2 を抜けて、i = 4 になりました。
赤枠 j は 1, 2, 3, 4 と変化します。

Fig.5

3回目

Fig.6

Loop 2 を抜けて、i = 3 になりました。
赤枠 j は 1, 2, 3 と変化します。

4回目

Fig.7

Loop 2 を抜けて、i = 2 になりました。
赤枠 j は 1, 2 と変化します。

5回目

Fig.8

Loop 2 を抜けて、i = 1 になりました。
赤枠 j は 1 だけになり、Loop 2, Loop 1 を抜けます。

結果

Fig.9

実行

1
2
3
4
5
6
7
fn main() {
    let mut vec: Vec<u32> = [16, 18, 6, 17, 0, 11, 9, 12, 10, 8, 2, 14, 13, 3, 15, 4, 19, 5, 1, 7].to_vec();

    println!("ソート前: {:?}", vec);
    bubble_sort(&mut vec);
    println!("ソート後: {:?}", vec);
}
1
2
3
4
$ cargo run

ソート前: [16, 18, 6, 17, 0, 11, 9, 12, 10, 8, 2, 14, 13, 3, 15, 4, 19, 5, 1, 7]
ソート後: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

おまけ

Cargo.toml に下記を追加

1
2
[dependencies]
rand = "0.7.3"

ランダムになった配列を作成する

1
2
3
4
5
6
7
8
use rand::seq::SliceRandom;
use rand::thread_rng;

fn random_vec(length: u32) -> Vec<u32> {
    let mut vec: Vec<u32> = (0..length).collect();
    vec.shuffle(&mut thread_rng());
    vec
}

comments powered by Disqus

Related Posts

挿入ソート

目次:プログラミング学習

コムソート

目次:プログラミング学習

シェーカーソート

目次:プログラミング学習

クイックソート

目次:プログラミング学習

二分木ヒープ

目次:プログラミング学習

二分探索木 - 操作(削除) -

目次:プログラミング学習