SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

マージ・ソート : 巨大データのソート法

C#, VB.NET, C++/CLI で学ぶアルゴリズム


「ソートされている」とは……

 まず、「昇順にソートされた状態」とはどんな状態のことでしょうか。

“任意に選んだデータが、それよりうしろに並んだデータより大きくない”が常に成り立つ

 あるいはこう言い換えてもいいでしょう:

どのデータであっても、その次のデータより大きくない

 つまりはi = 0..データ数-2に対しdata[i] <= data[i+1]が成り立つ、ということです。冒頭のバブル・ソートではこの条件を満たさない、つまり data[i] > data[i+1] であるとき両者を交換することを繰り返すアルゴリズムです。

 少量のデータについて考えてみましょう。0から9までの10個のデータをかき混ぜて並べてみました:

8 1 9 2 0 5 7 3 4 6

 このデータ列において、順序の反転している箇所に|を書き加えます。

8|1 9|2|0 5 7|3 4 6

 |で区切られたいくつかのデータ列ができました。それぞれのデータ列内は昇順にソートされています。この“昇順にソートされたデータ列”を「連(run)」と呼ぶことにしましょう。

 この例ではデータ列全体は5つの連で構成されています。これがソートされると:

0 1 2 3 4 5 6 7 8 9

 となり、連を区切る|がなくなります。つまり連の数が1ってことです。

 連の数が1であることが「ソートされた状態」と言ってもいいでしょうね。

「マージ」とは

 マージ・ソートのキモとなる戦略は、2本の連を1本の連にまとめる(併合:merge)ことにあります。

 さきほどの例「8|1 9|2|0 5 7|3 4 6」で先頭の二つの連「8」と「1 9」を一本の連にまとめると「1 8 9」となります。さらにその次の二本「2」と「0 5 7」をまとめると「0 2 5 7」となります。

 このように、二本の連をまとめて一本の連とすることができれば、全体では「1 8 9|0 2 5 7|3 4 6」となり、連の数が5から3に減りました。もう一度繰り返すと「0 1 2 5 7 8 9|3 4 6」、さらにもう一度やれば「0 1 2 3 4 5 6 7 8 9」となってソート完了です。

 2本の連を1本にマージすることで、データ列中の連の数はおよそ半分になります。この作業を繰り返して連の数を1にするのがマージ・ソートのアルゴリズムです。

次のページ
2本の連をマージする

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2886 2008/08/13 16:28

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー