ALDS1_2_A バブルソートをC++で解いてみた[AIZU ONLINE JUDGE]

AIZU ONLINE JUDGE

こんにちは! mnbd(@mnbbbbbd)です。

AIZU ONLINE JUDGEの「ALDS1_2_A バブルソート」を解いてみましたので、その回答と解説をご紹介いたします。

プログラミング初心者なので、もっといい回答があるに違いありません。

あくまでも「動作はする」サンプルとしてご覧ください。

問題文

バブルソートはその名前が表すように、泡(Bubble)が水面に上がっていくように配列の要素が動いていきます。バブルソートは次のようなアルゴリズムで数列を昇順に並び変えます。

1 bubbleSort(A, N) // N 個の要素を含む 0-オリジンの配列 A
2 flag = 1 // 逆の隣接要素が存在する
3 while flag
4 flag = 0
5 for j が N-1 から 1 まで
6 if A[j] < A[j-1]
7 A[j] と A[j-1] を交換
8 flag = 1

数列 A を読み込み、バブルソートで昇順に並び変え出力するプログラムを作成してください。また、バブルソートで行われた要素の交換回数も報告してください。

入力
入力の最初の行に、数列の長さを表す整数 N が与えられます。2行目に、N 個の整数が空白区切りで与えられます。

出力
出力は 2 行からなります。1行目に整列された数列を 1 行に出力してください。数列の連続する要素は1つの空白で区切って出力してください。2 行目に交換回数を出力してください。

https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/2/ALDS1_2_A

解答

#include <bits/stdc++.h>
using namespace std;

void print_array(int a[], int n) {
    for(int i = 0; i < n; i++) {
        cout << a[i];
        if(i == n - 1) {
            cout << endl;
        } else {
            cout << " ";
        }
    }
}

int bubble_sort(int a[], int n) {
    bool flag = true;
    int count = 0;
    while(flag) {
        flag = false;
        for(int i = n - 1; i >= 1; i--) {
            if(a[i] < a[i - 1]) {
                swap(a[i], a[i - 1]);
                flag = true;
                count++;
            }
        }
    }
    return count;
}

int main() {
    int n;
    cin >> n;
    int a[n];
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }

    int count = bubble_sort(a, n);

    for(int i = 0; i < n; i++) {
        cout << a[i];
        if(i == n - 1) {
            cout << endl;
        } else {
            cout << " ";
        }
    }
    cout << count << endl;

    return 0;
}

感想

バブルソートの問題です。

アルゴリズムが問題文中に書かれていますので、それをC++の文法に則って書いたものになります。

コードを見ただけですと、どのように配列の状態が変化しているのかがわかりにくいですね。

ページの一般解説に図が載っていますので、それを見るとイメージしやすかったです。

まとめ

AIZU ONLINE JUDGEの「ALDS1_2_A バブルソート」を解いてみましたので、その回答と解説をご紹介いたします。

以上です。
読んでいただきありがとうございました!

タイトルとURLをコピーしました