3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

最初に「あい」を学ぶことば日本語でプログラミング入門(Mindで定番アルゴリズム:クイックソート)

Last updated at Posted at 2025-12-27

はじめに

本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。とはいっても題材としては定番アルゴリズム:クイックソートを疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。

Mind(マインド)

プログラミング言語Mind(マインド)は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。ただし単語間の分かち書きが必須であくまで形式言語です。逆ポーランド記法1の範囲で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で書くことができ、独自の軽量中間コードのランタイム実行で非常に高速です。実装言語はCまたはMind。初版の登場は1985年で今年2025年は生誕40周年となります。

Mind(マインド)の入手方法

無償版のMind version 8 (windows版linux版)を下記の公式サイトからダウンロードできます。フリーメールでかまいませんのでメールアドレスをご登録くださいませ。

定番アルゴリズム:クイックソートとは

アルゴリズムは、問題を解決するための手順や計算方法を意味します。ソート(整列・並べ替え)はデータの並び順を特定の条件で並べ替えるためのアルゴリズムで、いくつかの定番ロジックが存在します。

ここではその中のひとつクイックソートを扱ってみます。クイックソートは適当な基準値(ピボット)を選び、その基準値を基にデータを小さい方と大きい方に分けることから始め、このプロセスを再帰的に繰り返すことで全体を整列させるロジックです。平均的には非常に高速で大規模なデータセットにも適しているとされていますが、ピボットの選択により計算量は変動します。

プログラミングの3大ロジック構造とは

順次、分岐、反復の3つの制御構造(control structures)によって処理の流れを記述することを構造化プログラミングといいます。クイックソートもこの構造で構成されます。

1.順次(sequence) 部分プログラムを順々に実行する。
2.分岐(bifurcation) 条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
3.反復(repetition) 条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。ループ処理。

クイックソートは、分割統治法 (Divide-and-Conquer) というアルゴリズム設計の強力な手法に基づいています。これは、複雑な問題をより小さな、扱いやすい部分問題に分割し、それぞれを解決してから、その結果を統合して元の問題を解決する手法です。

これは問題解決能力の重要な構成要素でもあります。

プログラミング的思考力の構成要素(1)
分解・整理する 複雑な問題を小さな問題に分けて認識する
コンピュテーショナルシンキング(CT) 計算論的思考の構成要素(1)
問題を分解する 複雑な問題を解決可能なレベルまで分解する

分割統治法は、「分割」「統治」「結合」の3つのステップを踏むのが一般的ですが、今回の例では「分割」「統治」の2ステップとなります。

まず、配列の中から1つの要素をピボットとして選びます。今回の例では左端の要素をピボットの初期値とします。そのピボットを基準に、配列を2つの部分配列に分割します。左側にはピボット以下の要素、右側にはピボットより大きい要素が配置されます。ここが「分割」。ピボットで分割という処理の内容がたまたま分割統治法の「分割」と同じですが、これは再帰的に繰り返す以下の処理と子の分割処理を分割したという意味のが妥当なようです。

各部分配列に対して再帰的に同様の操作を行い、最終的に全ての要素が整列されるまで繰り返します。 ここが「統治」。「再帰的」にというのは重要なポイントです。

お題のソースコード

並べ替え対象のデータ群には15の要素を持つ「配列」という特殊な整数型の変数を用意します。

段ボール箱が15あり、その中に小さなボールが複数づつ入っている状態をイメージしてください。段ボール箱は1つづつ15並んでいるのではなく、1つの長い段ボール箱が5つのセクションで区切られているようなイメージが配列に近いです。ボールの数はおおむね右から左に向かって多くなり、同じ数が格納されていることはないとします。

Mindの場合、15の要素数の段ボール箱の配列要素番号は1からはじまり15で終わります。

quicksort.src
段ボール箱は 15の 変数。
段ボール箱初期値は 定数配列
17 18 19 21 15 14 13 12 3 10  9  8  7  6  5。

段ボール箱を初期化するとは  (・ → ・)
    段ボール箱に 段ボール箱初期値を 入れる。

段ボール箱のボールの数を表示するとは  (文字列 → ・)
        整列前後は 文字列

    整列前後に 入れ
    整列前後を 一行表示し
    「要素番号 」を 表示し
    段ボール箱の 要素数で 回数指定し
        回数を 二桁で数値表示し 「 」を 表示し
    繰り返す
    改行してから 「ボール数 」を 表示し
    段ボール箱の 要素数で 回数指定し
        段ボール箱(回数)を 二桁で数値表示し 「 」を 表示し
    繰り返す
    改行し 改行する。

段ボール箱の値を入れ替えるとは  (入替元要素番号 入替先要素番号 → ・)
        入替元要素番号は 変数
        入替先要素番号は 変数
        一時退避のボール数は   変数

    入替先要素番号に 入れ
    入替元要素番号に 入れ
    一時退避のボール数に 段ボール箱(入替先要素番号)を 入れ
    段ボール箱(入替先要素番号)に 段ボール箱(入替元要素番号)を 入れ
    段ボール箱(入替元要素番号)に 一時退避のボール数を 入れる
    ※処理経過表示処理ここから
    「 要素番号」を 表示し 入替元要素番号を 数値表示し 「と」を 表示し 
                         入替先要素番号を 数値表示し 「を入れ替えました。」を 表示し
    段ボール箱(入替元要素番号)を 数値表示し 「 ⇔ 」を 表示し
    段ボール箱(入替先要素番号)を 数値表示し 改行し
    ※処理経過表示処理ここまで
。        

段ボール箱をパーティショニングするとは  (左側要素番号 右側要素番号 → ピボットの要素番号)
        左側要素番号は 変数
        右側要素番号は 変数
        要素番号は 変数
        ピボットは 変数
        ピボットの要素番号は 変数

    右側要素番号に 入れ
    左側要素番号に 入れ
    「パーティショニング:左側要素番号 」を 表示 左側要素番号を 数値表示 「 右側要素番号 」を 表示 右側要素番号を 数値表示し 改行し
    ピボットに 段ボール箱(左側要素番号)を 入れ
    左側要素番号に 1を 加えて 要素番号に 入れ
    右側要素番号を ピボットの要素番号に 入れ

    ここから
        ここから
            要素番号が 右側要素番号より 大きい ならば 打ち切り つぎに
            段ボール箱(要素番号)が ピボットより 大きい ならば 打ち切り つぎに
            要素番号を 一つ増加する
        繰り返す
        ここから
            ピボットの要素番号が 左側要素番号より 小さい ならば 打ち切り つぎに
            段ボール箱(ピボットの要素番号)が ピボット 以下 ならば 打ち切り つぎに
            ピボットの要素番号を 一つ減少する
        繰り返す
        「増減ループ後:要素番号 」を 表示 要素番号を 数値表示 「 ピボットの要素番号 」を 表示 ピボットの要素番号を 数値表示し 改行し
        要素番号が ピボットの要素番号 以上 ならば 打ち切り つぎに
        要素番号と ピボットの要素番号が 異なる
        ならば
            要素番号と ピボットの要素番号で 段ボール箱の値を入れ替える
            「パーティショニング:整列中」の 段ボール箱のボールの数を表示する
        つぎに
    繰り返す
    左側要素番号と ピボットの要素番号が 異なる
    ならば
        左側要素番号と ピボットの要素番号で 段ボール箱の値を入れ替える
        「パーティショニング:ピボットの要素番号 」を 表示 ピボットの要素番号を 数値表示し 改行
        「パーティショニング:整列中」の 段ボール箱のボールの数を表示する
    つぎに
    ピボットの要素番号をつむ。


段ボール箱をクイックソートするとは  (左側要素番号 右側要素番号 → ・)
        左側要素番号は 変数
        右側要素番号は 変数
        ピボットの要素番号は 変数

    右側要素番号に 入れ
    左側要素番号に 入れ
    ※「クイックソート:左側要素番号 」を 表示 左側要素番号を 数値表示 「 右側要素番号 」を 表示 右側要素番号を 数値表示し 改行し
    左側要素番号が 右側要素番号より 小さい
    ならば
        左側要素番号と 右側要素番号で 段ボール箱をパーティショニングし ピボットの要素番号に 入れ
        左側要素番号と ピボットの要素番号から 1を 引いて 段ボール箱をクイックソートし ※左側を再帰的にソート
        ピボットの要素番号から 1を 加えて 右側要素番号で 段ボール箱をクイックソートする ※右側を再帰的にソート
    つぎに。


メインとは  (・ → ・)
    段ボール箱を初期化し
    「整列前」の 段ボール箱のボールの数を表示する
    1と 段ボール箱の 要素数で 段ボール箱をクイックソートし
    「整列後」の 段ボール箱のボールの数を表示する。

「段ボール箱をクイックソート」が大枠再帰的にループを回しているロジックですが、実際に要素の入れ替えを行っているロジックは「段ボール箱をパーティショニングする」です。そしてさらに指定された要素の入れ替えを行う「段ボール箱の値を入れ替える」が直接入れ替えています。
この内部での入れ替え反復処理の動きがわかるようにピボットの要素番号などの中間変数の動きはコンソール出力しています。

お題のソースコードをコンパイル

では、コンパイルしてみます。Mind8によるコンパイル結果です。

C:\developments\vscode\mind9\algorithm>mind quicksort file

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> quicksort.exe

無事に成功しました。実際はコンパイル成功した後もいろいろ動作を修正調整しました。

実行結果

実行結果です。

C:\developments\vscode\mind9\algorithm>quicksort
整列前
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数 17 18 19 21 15 14 13 12  3 10  9  8  7  6  5 

パーティショニング:左側要素番号 1 右側要素番号 15
増減ループ後:要素番号 2 ピボットの要素番号 15
 要素番号2と15を入れ替えました。5 ⇔ 18
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数 17  5 19 21 15 14 13 12  3 10  9  8  7  6 18 

増減ループ後:要素番号 3 ピボットの要素番号 14
 要素番号3と14を入れ替えました。6 ⇔ 19
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数 17  5  6 21 15 14 13 12  3 10  9  8  7 19 18 

増減ループ後:要素番号 4 ピボットの要素番号 13
 要素番号4と13を入れ替えました。7 ⇔ 21
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数 17  5  6  7 15 14 13 12  3 10  9  8 21 19 18 

増減ループ後:要素番号 13 ピボットの要素番号 12
 要素番号1と12を入れ替えました。8 ⇔ 17
パーティショニング:ピボットの要素番号 12
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  8  5  6  7 15 14 13 12  3 10  9 17 21 19 18 

パーティショニング:左側要素番号 1 右側要素番号 11
増減ループ後:要素番号 5 ピボットの要素番号 9
 要素番号5と9を入れ替えました。3 ⇔ 15
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  8  5  6  7  3 14 13 12 15 10  9 17 21 19 18 

増減ループ後:要素番号 6 ピボットの要素番号 5
 要素番号1と5を入れ替えました。3 ⇔ 8
パーティショニング:ピボットの要素番号 5
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8 14 13 12 15 10  9 17 21 19 18 

パーティショニング:左側要素番号 1 右側要素番号 4
増減ループ後:要素番号 2 ピボットの要素番号 1
パーティショニング:左側要素番号 2 右側要素番号 4
増減ループ後:要素番号 3 ピボットの要素番号 2
パーティショニング:左側要素番号 3 右側要素番号 4
増減ループ後:要素番号 4 ピボットの要素番号 3
パーティショニング:左側要素番号 6 右側要素番号 11
増減ループ後:要素番号 9 ピボットの要素番号 11
 要素番号9と11を入れ替えました。9 ⇔ 15
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8 14 13 12  9 10 15 17 21 19 18 

増減ループ後:要素番号 11 ピボットの要素番号 10
 要素番号6と10を入れ替えました。10 ⇔ 14
パーティショニング:ピボットの要素番号 10
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8 10 13 12  9 14 15 17 21 19 18 

パーティショニング:左側要素番号 6 右側要素番号 9
増減ループ後:要素番号 7 ピボットの要素番号 9
 要素番号7と9を入れ替えました。9 ⇔ 13
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8 10  9 12 13 14 15 17 21 19 18 

増減ループ後:要素番号 8 ピボットの要素番号 7
 要素番号6と7を入れ替えました。9 ⇔ 10
パーティショニング:ピボットの要素番号 7
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8  9 10 12 13 14 15 17 21 19 18 

パーティショニング:左側要素番号 8 右側要素番号 9
増減ループ後:要素番号 9 ピボットの要素番号 8
パーティショニング:左側要素番号 13 右側要素番号 15
増減ループ後:要素番号 16 ピボットの要素番号 15
 要素番号13と15を入れ替えました。18 ⇔ 21
パーティショニング:ピボットの要素番号 15
パーティショニング:整列中
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8  9 10 12 13 14 15 17 18 19 21 

ボール数  3  5  6  7  8  9 10 12 13 14 15 17 18 19 21 

パーティショニング:左側要素番号 13 右側要素番号 14
増減ループ後:要素番号 14 ピボットの要素番号 13
整列後
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8  9 10 12 13 14 15 17 18 19 21 

C:\developments\vscode\mind9\algorithm>

ちょっとくどいくらい変数の動きをコンソール出力していますが、並べ替えの動きのイメージがつかめれば幸いです。

中間の動きのコンソール出力をコメントアウトした場合は下記のようになります。

C:\developments\vscode\mind9\algorithm>quicksort
整列前
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数 17 18 19 21 15 14 13 12  3 10  9  8  7  6  5 

整列後
要素番号  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
ボール数  3  5  6  7  8  9 10 12 13 14 15 17 18 19 21 

C:\developments\vscode\mind9\algorithm>

おわりに

いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。

  1. 演算子を被演算子の中間に記述する中置記法 1 + 2、前に記述する前置記法(ポーランド記法)+ 1 2、後に記述する後置記法(逆ポーランド記法)1 2 +がある。日本語は1と 2を 足す。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?