2
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で定番アルゴリズム: ヒープソート)

2
Last updated at Posted at 2026-04-24

はじめに

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

Mind(マインド)

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

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

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

定番アルゴリズム:ヒープソートとは

アルゴリズムは、問題を解決するための手順や計算方法を意味します。アルゴリズムにはいくつかの定番ロジックが存在します。

ここではその中のひとつ「ヒープソート」を扱ってみます。「ヒープソート」は並べ替えのロジックです。無秩序な数列をいったん最大値を頂点とする木構造に変換してから並べ替えを行います。最小値を頂点とする木構造を利用するバリエーションもありますが、この記事では最大値を頂点とする木構造を使います。(最大ヒープを使ったソート)

お題のソースコード

下記のような数列を並べ替えるとします。

12, 3, 17, 8, 34, 25, 1, 9

いったん下図のようなツリー構造を構築します。中間的なツリー構造は一意ではないので、あくまでイメージとしてとらえてください。すべての親 ≥ 子 を満たしていることがポイントです。

            34
        /        \
      9           25
    /   \        /   \
  12     3     17     1
 /
8

この二分木構造を使って、ランダムな数列を昇順に並べ替えるのがお題です。

この二分木構造を1次元配列の数列で表すと下記のようになります。

34, 9, 25, 12, 3, 17, 1, 8

Mindの配列の基数は1です。基数0の配列を使った一般的なプログラミング言語の実装とはインデックスの扱いが異なる点にご留意ください。

このあたりとか。

ヒープ構築するとは (インデックス → ・)
  ※~略~
    インデックスに 入れ
    インデックスに 2を 掛けて インデックス左に 入れ
    インデックスに 2を 掛けて 1を 加えて インデックス右に 入れ
  ※~略~

下記がソースコード全文となります。

maxheap.src
最大容量は         数値 10。

ヒープは       最大容量の 変数。
ヒープサイズは             変数。
ヒープ初期状態は 定数配列 12, 3, 17, 8, 34, 25, 1, 9。

最大ヒープを初期化するとは (・ → ・)
    ヒープ初期状態の 要素数で 回数指定して
        ヒープ(回数)に ヒープ初期状態(回数)を 入れ
    繰り返す
    ヒープ初期状態の 要素数を ヒープサイズに 入れること。

ヒープ状態を表示するとは (・ → ・)
    ヒープ初期状態の 要素数で 回数指定して
        ヒープ(回数)を 数値表示し 「,」を 表示し
    繰り返す
    改行すること。


ヒープ入替するとは (インデックス左 インデックス右 → ・)
        インデックス左は 変数
        インデックス右は 変数
        一時変数は    変数
    
    インデックス右に 入れ
    インデックス左に 入れ
    一時変数に ヒープ(インデックス左)を 入れ
    ヒープ(インデックス左)に ヒープ(インデックス右)を 入れ
    ヒープ(インデックス右)に 一時変数を 入れること。

ヒープ構築するとは (インデックス → ・)
        インデックスは     変数
        インデックス左は   変数
        インデックス右は   変数
        インデックス最大値は    変数
    
    インデックスに 入れ
    インデックスに 2を 掛けて インデックス左に 入れ
    インデックスに 2を 掛けて 1を 加えて インデックス右に 入れ
    インデックス最大値に インデックスを 入れ

    インデックス左が ヒープサイズ 以下
    ならば
        ヒープ(インデックス左)が ヒープ(インデックス最大値)より 大きい
        ならば
            インデックス最大値に インデックス左を 入れ
        つぎに
    つぎに
    インデックス右が ヒープサイズ 以下
    ならば
        ヒープ(インデックス右)が ヒープ(インデックス最大値)より 大きい
        ならば
            インデックス最大値に インデックス右を 入れ
        つぎに
    つぎに

    インデックス最大値が インデックスと 等しい
    でなければ
        インデックスと インデックス最大値で ヒープ入替し
        インデックス最大値で ヒープ構築する
    つぎに。    
 

ヒープソートするとは (・ → ・)
        データ数は 変数
        データの半数は 変数
        インデックスは 変数

    データ数に ヒープ初期状態の 要素数を 入れ
    データ数を 2で 割り データの半数に 入れ
    
    データの半数で 回数指定して
        データの半数から 回数を 引いて 1を 加え インデックスに 入れ
        インデックスで ヒープ構築し  
    繰り返す
    
    「最大ヒープ構築後 :」を 表示し  ヒープ状態を表示し

    データ数から 1を 引いて 回数指定して
        データ数から 回数を 引いて 1を 加え インデックスに 入れ
        1と インデックスで ヒープ入替し
        ヒープサイズを 一つ減少し
        1で ヒープ構築し  
    繰り返す。

メインとは (・ → ・)
    最大ヒープを初期化し
    「ヒープソートする前:」を 表示し  ヒープ状態を表示し
    ヒープソートし
    「ヒープソートした後:」を 表示し  ヒープ状態を表示すること。

「ヒープ構築する」という処理単語は再帰的に書かれています。

ヒープ配列の「最大容量」はお題の数列の定数配列の要素数より大きめに確保してあります。

ただし、下記のヶ所は(「インデックス右」の場合も)

    インデックス左が ヒープサイズ 以下
    ならば
        ヒープ(インデックス左)が ヒープ(インデックス最大値)より 大きい

下記のように書いた場合

    インデックス左が ヒープサイズ 以下
    かつ
        ヒープ(インデックス左)が ヒープ(インデックス最大値)より 大きい

Mindの「かつ」は短絡評価しないため、「インデックス左」(右の場合も)が「ヒープサイズ」を超えてヒープ配列の「最大容量」を超えるような場合は、配列の要素数オーバーとなる点ご注意ください。

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

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

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

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

実行結果

実行結果です。

C:\developments\vscode\mind9\algorithm>maxheap
ヒープソートする前:12,3,17,8,34,25,1,9,
最大ヒープ構築後 :34,12,25,9,3,17,1,8,
ヒープソートした後:1,3,8,9,12,17,25,34,

かなり芸のない出力ですが、昇順の並べ替えが実行されました:tada:

今回の中間最大ヒープは下図のような状態となりました。これはこれですべての親 ≥ 子 を満たしています。

            34
        /        \
      12          25
    /   \        /   \
   9     3     17     1
  /
 8

おわりに

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

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

2
1
3

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
2
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?