(Translated by https://www.hiragana.jp/)
ソート - Wikipedia コンテンツにスキップ

ソート

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
昇順しょうじゅんから転送てんそう

ソート (えい: sort) は、データ集合しゅうごう一定いってい規則きそくしたがってならべること[1]日本語にほんごでは整列せいれつ(せいれつ)、なら(ならべかえ)、分類ぶんるい(ぶんるい)などとやくされる[1]

おも配列はいれつ連結れんけつリストのような、リストデータ構造こうぞう分類ぶんるいされるコレクション(コンテナ)に格納かくのうされている要素ようそデータを、ぜん順序じゅんじょ関係かんけいによってならえることをす。また、たんに「ソート」といった場合ばあいちいさいほうからおおきいほうじゅんならべる昇順しょうじゅん(しょうじゅん、えい: ascending order)をすことがおおい。その反対はんたいおおきいほうからちいさいほうじゅんならべることを降順こうじゅん(こうじゅん、えい: descending order)という。

対象たいしょうとなるコレクションのデータ構造こうぞう必要ひつようとされる出力しゅつりょく、また時間じかんてきコストと空間くうかんてきコストのいによって、ソートに使つかわれるアルゴリズムことなる。

概要がいよう[編集へんしゅう]

効率こうりつてきなソートは、ソートみのデータを必要ひつようとするほかのアルゴリズム(探索たんさくマージ)の最適さいてきにとっても重要じゅうようである。また、ソートされたデータのほう人間にんげんにとってもみやすい。形式けいしきてきには、その出力しゅつりょく以下いかの2つの条件じょうけんたさなければならない。

  1. 設定せっていされた順序じゅんじょ昇順しょうじゅんまたは降順こうじゅん)にたいして、ぎゃくになるような順序じゅんじょ出力しゅつりょくがあってはならない。
  2. 出力しゅつりょく入力にゅうりょくならえでなければならない。

情報じょうほう工学こうがく計算けいさん科学かがく黎明れいめいから、ソートは単純たんじゅん問題もんだいでありながら効率こうりつてきくことがむずかしく、そのためもあってさかんに研究けんきゅうされてきた。たとえばバブルソートについては、はやくも1956ねんには解析かいせきおこなわれている[2]。しかし、21世紀せいきはつにもあらたなソートアルゴリズムが発明はつめいされている(たとえば、Timsort英語えいごばんは2002ねんに、図書館としょかんソートは2004ねん発表はっぴょうされた)。すでに考案こうあんされているソートにも様々さまざまなアルゴリズムがあり、またアルゴリズムという概念がいねん学習がくしゅうするのに最適さいてきなので、情報じょうほう工学こうがく計算けいさん科学かがくでの入門にゅうもんてき題材だいざいとしてひろしたしまれている。たとえば、分割ぶんかつ統治とうちほうデータ構造こうぞうみだれアルゴリズム計算けいさんりょう解析かいせきO記法きほう時間じかん空間くうかんのトレードオフ下限かげんなどがふくまれる。

グラフィカルユーザインタフェース (GUI) においてよく使つかわれるウィジェットのひとつとしてリストビュー (list view) がげられるが、かくレコードのフィールドをあらわ任意にんいのカラムについてリストちゅうのアイテムを昇順しょうじゅん降順こうじゅんソートできるようになっていることがおおい。

分類ぶんるい[編集へんしゅう]

計算けいさん科学かがくでは、ソートアルゴリズムをつぎのように分類ぶんるいする。

安定あんていソート[編集へんしゅう]

おなかんして、ソートまえ順序じゅんじょがソート維持いじされているソートを安定あんていソートという。

安定あんていソートでないソートであっても、ソート条件じょうけんもと順序じゅんじょふくめることでかなら安定あんていソートにすることが可能かのうである。しかしながら、別途べっともと順序じゅんじょ記憶きおくする領域りょういき必要ひつようになることから、内部ないぶソートであっても外部がいぶソートになってしまう。(→#内部ないぶソートと外部がいぶソート

内部ないぶソートと外部がいぶソート[編集へんしゅう]

ソートされるデータの格納かくのう領域りょういき変更へんこうして処理しょりすすめていくIn-placeのソートを内部ないぶソートという。クイックソートのような再帰さいき利用りようするアルゴリズムは、再帰さいきのために O(log n) の領域りょういき必要ひつようとすることからIn-placeであるかかは議論ぎろんかれるところであるが、これも内部ないぶソートにふくめるのが一般いっぱんてきである。このことから内部ないぶソートは、ソートされるデータの格納域かくのういき以外いがいには O(1) か O(log n) の領域りょういきしか必要ひつようとしない。

ぎゃくに、ソートされるデータの格納かくのう領域りょういき以外いがいに O(n) 以上いじょう一時いちじてき記憶きおく領域りょういき必要ひつようであるソートを外部がいぶソートという。

メモリ使用しようりょう(およびその計算けいさん資源しげん使用しようりょう)による分類ぶんるいである。すべての内部ないぶソートは、インデックスや参照さんしょう複製ふくせい作成さくせいして処理しょりすることで事実じじつじょう外部がいぶソートにすることができる。アルゴリズムとしての本質ほんしつではないので一般いっぱんてきには無視むしされるが、高速こうそく柔軟じゅうなん処理しょりのために冗長じょうちょう記憶きおく領域りょういき使用しようする場合ばあいがある。たとえば、安定あんていソートアルゴリズムで安定あんていソートを実現じつげんする場合ばあいなど。(→#安定あんていソート

比較ひかくソート[編集へんしゅう]

個々ここ項目こうもく比較ひかく演算えんざん大小だいしょう判定はんていすることを基本きほんとするソートを比較ひかくソートという。

比較ひかくソートには#比較ひかくソートの理論りろん限界げんかい存在そんざいする。

計算けいさんりょう[編集へんしゅう]

入力にゅうりょくされるリストの項目こうもくすう nもとづいた計算けいさんりょうによる分類ぶんるい典型てんけいてきなソートアルゴリズムでは、最善さいぜんO(n log n) 、最悪さいあくで O(n2) である。理想りそうは O(n) である。

比較ひかくソートでは、一般いっぱんてきな(ランダムにならんだ)データのならえにたいしてはすくなくとも O(n log n) の比較ひかく回数かいすう必要ひつようである。(→#比較ひかくソートの理論りろん限界げんかい

手法しゅほう[編集へんしゅう]

汎用はんよう手法しゅほうによる分類ぶんるい挿入そうにゅう交換こうかん選択せんたく、マージなどがある。交換こうかんソートにはバブルソートやシェーカーソートやコムソートなどがふくまれる。選択せんたくソートにはヒープソートなどがふくまれる。

再帰さいき[編集へんしゅう]

再帰さいき必須ひっす不可能ふかのう、どちらでも可能かのう、という分類ぶんるい実装じっそうじょう都合つごう再帰さいきかかわる制限せいげんがある場合ばあい注目ちゅうもくされる。

一覧いちらん[編集へんしゅう]

配列はいれつ格納かくのうされたnのデータをソートする場合ばあいについて、かくアルゴリズムの性能せいのうしめす。 計算けいさん時間じかん表記ひょうきもちいている記号きごう O(オー)については、ランダウの記号きごう参照さんしょう

以下いかひょうで、n はソートすべきデータ要素ようそすうである。平均へいきん実行じっこう時間じかん最悪さいあく実行じっこう時間じかん時間じかん計算けいさんりょうしめしている。このとき、ソートキーのながさは一定いってい仮定かていしており、比較ひかく交換こうかんといった操作そうさ定数ていすう時間じかんおこなわれるとする。メモリ使用しようりょうは、入力にゅうりょくデータの格納域かくのういき以外いがい必要ひつようとなる領域りょういきしめしている。これらは、いずれも比較ひかくソートである。

名称めいしょう
平均へいきん計算けいさん時間じかん
最悪さいあく計算けいさん時間じかん
メモリ使用しようりょう
安定あんていせい
手法しゅほう
備考びこう
バブルソート 交換こうかん
シェーカーソート 交換こうかん
コムソート × 交換こうかん コードサイズがちいさくてむ。
ノームソート 交換こうかん
センタク/選択せんたくソート × 選択せんたく 安定あんていソートとしても実装じっそう可能かのう
ソウニユウ/挿入そうにゅうソート 挿入そうにゅう 最良さいりょう計算けいさん時間じかんになる。
シェルソート × 挿入そうにゅう 最悪さいあく数列すうれつ実用じつようされている。
2分木ぶんぎソート 挿入そうにゅう 平衡へいこう2ふん探索たんさく使つかった場合ばあい
図書館としょかんソート 挿入そうにゅう
マージソート マージ 連結れんけつリスト場合ばあい外部がいぶメモリ。
In-place マージソート マージ 実装じっそうれい
ヒープソート × 選択せんたく
スムースソート × 選択せんたく
クイックソート × パーティショニング メモリはコールスタック素朴そぼく実装じっそうでは になる)
イントロソート × 混成こんせい メモリはコールスタック
ペイシェンスソート × 挿入そうにゅう 以内いないにすべての最長さいちょう増加ぞうか分列ぶんれつさがす。
ストランドソート 選択せんたく
キクウテンチ/奇偶きぐう転置てんちソート 交換こうかん
シェアソート × 交換こうかん

つぎひょうは、比較ひかくソート以外いがいのソートアルゴリズムの一覧いちらんである。そのため、下限かげんが O(n log n) で制限せいげんされない。k はキーのながさ、s実装じっそう使つかわれるチャンクのサイズである。これらの一部いちぶは、キーが十分じゅうぶんながく、かく要素ようそのキーが重複じゅうふくしないことを前提ぜんていとしている。すなわち、n << 2k仮定かていしている(<< は「十分じゅうぶんちいさい」)。

名称めいしょう
平均へいきん計算けいさん時間じかん
最悪さいあく計算けいさん時間じかん
メモリ使用しようりょう
安定あんていせい
n << 2k?
備考びこう
ハトノス/ばとソート
バケットソート × 入力にゅうりょくデータは定義ていぎいき一様いちよう分布ぶんぷすると仮定かてい
フンフカソエ/分布ぶんぷすうえソート
LSD 基数きすうソート ×
MSD 基数きすうソート × ×
スプレッドソート × × n << 2k場合ばあい計算けいさん時間じかんだが、それ以外いがい場合ばあいでもソート可能かのう
キヤクシヤソウ/ぎゃく写像しゃぞうソート  ? N/A  ? ×

つぎひょうは、あまりにも性能せいのうわるいので通常つうじょうもちいられないソートアルゴリズム、および特別とくべつなハードウェアが必要ひつようなソートアルゴリズムの一覧いちらんである。

名称めいしょう
平均へいきん計算けいさん時間じかん
最悪さいあく計算けいさん時間じかん
メモリ使用しようりょう
安定あんていせい
大小だいしょう比較ひかく
備考びこう
ボゴソート × 平均へいきん時間じかんはクヌースのシャッフルを使つかった場合ばあい
ボゾソート × 平均へいきん時間じかんはボゴソートのやく半分はんぶん漸近ぜんきんする。
ストゥージソート ×
スリープソート 最大さいだい×プロセス起動きどう単位たんい時間じかん実際じっさいには誤差ごさあり) 同左どうさ ? × ? 条件じょうけん特殊とくしゅ実用じつよう正確せいかくせい保証ほしょうされない。
ビードソート N/A N/A N/A × 専用せんようハードウェアが必要ひつよう
タンシユンハンケエキ/単純たんじゅんパンケーキソート × 反転はんてん定数ていすう時間じかんおこなえるものと仮定かてい
ソーティングネットワーク × おおきさ 回路かいろ必要ひつよう
バイトニックソート × × 計算けいさん時間じかんとメモリ使用しようりょうはソーティングネットワークとして実装じっそうしたときの
バッチャー奇偶きぐうマージソート × × 計算けいさん時間じかんとメモリ使用しようりょうはソーティングネットワークとして実装じっそうしたときの

比較ひかくソートアルゴリズムの最悪さいあく計算けいさんりょう下界げかい[編集へんしゅう]

ソートをおこなさい要素ようそあいだ順序じゅんじょ決定けっていを2要素ようそ大小だいしょう関係かんけい比較ひかく処理しょりのみをもちいておこなうことにする。このとき要素ようそからなるリストをソートするアルゴリズムの最悪さいあく比較ひかく回数かいすうかいとなる。すなわち、どんな比較ひかくソートアルゴリズムであっても入力にゅうりょくによっては(一般いっぱんてき入力にゅうりょくたいしては)漸近ぜんきんてきかい比較ひかく必要ひつようとなる。

この理由りゆう説明せつめいする。ある比較ひかくソートアルゴリズムがあたえられたさい様々さまざま入力にゅうりょくたいする処理しょり手順てじゅん二分にぶん決定けっていとしてあらわすことができる。内部ないぶノードは2要素ようそ比較ひかく処理しょりあらわし、内部ないぶノードからノードへの2ほんえだ比較ひかく結果けっかおうじた処理しょりあらわす。また、処理しょり終了しゅうりょうあらわす。このときたかさが最悪さいあく比較ひかく回数かいすうとなる。要素ようそからなるリストが入力にゅうりょくされるとき、どのような二分にぶん決定けっていつくったとしても、たかさがになることをしめす。二分にぶん決定けっていたかさをとしたときかたちによらず、かず以下いかになる。要素ようそからなるリストの(添字そえじの)置換ちかん存在そんざいするが、任意にんい入力にゅうりょくたいしてアルゴリズムがただしい出力しゅつりょくをするためには、ことなるリストを入力にゅうりょくしたさい、それらがすべてことなる到達とうたつできるようにしなければならない。よって、かず以上いじょうでなければならない。以上いじょうより、である。スターリングの公式こうしきよりなので、。よって、。よって

以上いじょうより、任意にんい比較ひかくソートアルゴリズムの最悪さいあく計算けいさんりょうとなる。すなわち、比較ひかくソートアルゴリズムの最悪さいあく計算けいさんりょう下界げかい漸近ぜんきんてきにはとなる。

マージソート、ヒープソートなどの比較ひかくソートアルゴリズムの最悪さいあく計算けいさんりょうであるため、これらのアルゴリズムの最悪さいあく計算けいさんりょう上記じょうき下界げかい漸近ぜんきんてき一致いっちしているとえる。つまり、これらのアルゴリズムの最悪さいあく計算けいさんりょう漸近ぜんきんてき最適さいてきである。

メモリ使用しようパターンとインデックスソート[編集へんしゅう]

ソート対象たいしょう配列はいれつしゅ記憶きおく使つかるような(あるいはえるような)おおきさであった場合ばあい、より低速ていそく補助ほじょ記憶きおく装置そうち使つかわれるので、アルゴリズムのメモリ使用しようパターンが重要じゅうようとなる。そのような状況じょうきょうでは、しゅ記憶きおくじょうですべてソートできることを前提ぜんていとしたアルゴリズムは効率こうりつ極端きょくたん悪化あっかする可能かのうせいがある。このような状況じょうきょうでは、比較ひかく演算えんざん回数かいすうはあまり重要じゅうようではなくなり、ディスクとのメモリ領域りょういきスワップ回数かいすう重要じゅうようとなる。したがって、なるべくスワップ回数かいすうやさないようにするために、配列はいれつ全体ぜんたい走査そうさする回数かいすう比較ひかく局所きょくしょせい比較ひかく回数かいすうよりも重要じゅうようとなる。

たとえば、再帰さいきがたクイックソートしゅ記憶きおくじょうでは性能せいのういが、ソート対象たいしょう配列はいれつしゅ記憶きおくおさまらない場合ばあいはスワップが頻繁ひんぱん発生はっせいして、性能せいのう極端きょくたん低下ていかする。したがって、そのような場合ばあい比較ひかく回数かいすうおおくてものアルゴリズムを使つかったほうがよい。

対策たいさくひとつとして、ソート対象たいしょう配列はいれつ要素ようそが(関係かんけいデータベースのような)複雑ふくざつなレコードだった場合ばあい、その配列はいれつをそのままソートするのではなく、比較的ひかくてきちいさいインデックスを生成せいせいして、インデックスの配列はいれつをソートするという方法ほうほうがある。インデックスをソートすれば、もと配列はいれつのソートはいちかい走査そうさ可能かのうであるが、インデックス経由けいゆでアクセスするだけならそれをする必要ひつようもない。インデックスはもと配列はいれつのレコードよりもちいさいので、メモリにおさまる可能かのうせいたかくなり、スワップ問題もんだい削減さくげんすることができる。この方式ほうしきを「タグソート(tag sort)」などとぶこともある[3]

べつ技法ぎほうとして、2つのアルゴリズムをわせて、それぞれの利点りてん利用りようする方法ほうほうがある。たとえば、配列はいれつをチャンクに分割ぶんかつして個々ここのチャンクがしゅ記憶きおくじょうでソートできるおおきさにする。チャンクないのソートはメモリじょう効率こうりつてき動作どうさするソートアルゴリズムを使つかい、その結果けっかマージソートでマージする。これは、もと配列はいれつ単純たんじゅんにマージソートでソートするよりも効率こうりつわるいが、全体ぜんたいをクイックソートでソートするよりもメモリ使用しようりょうすくなくてすむ。

これらの技法ぎほうわせることも可能かのうである。あまりにも巨大きょだいなデータをソートする場合ばあい、インデックスのソートにも複数ふくすうのアルゴリズムをわせて仮想かそう記憶きおく性質せいしつうよう設計せっけいする必要ひつようがある。

脚注きゃくちゅう[編集へんしゅう]

出典しゅってん[編集へんしゅう]

  1. ^ a b ASCII.jpデジタル用語ようご辞典じてん. “ソート”. コトバンク. 2020ねん6がつ1にち閲覧えつらん
  2. ^ Bubble Sort: An Archaeological Algorithmic Analysis Owen Astrachan
  3. ^ tag sort Definition PCMAG.COM

参考さんこう文献ぶんけん[編集へんしゅう]

関連かんれん項目こうもく[編集へんしゅう]

外部がいぶリンク[編集へんしゅう]

ソートアルゴリズムの視覚しかく[編集へんしゅう]

  • sort algorithm visualizer - 11種類しゅるいのソートアルゴリズムについて各種かくしゅ初期しょき条件じょうけんでのソートの様子ようす視覚しかく
  • いくつかのソートアルゴリズムを視覚しかくしたJava applet
  • Sort Animation - Javaアプレットによるバブルソート、挿入そうにゅうソート、クイックソート、選択せんたくソートのアニメーション図解ずかい
  • xSortLab - べつのJavaアプレット。バブルソート、挿入そうにゅうソート、クイックソート、選択せんたくソート、マージソートをアニメーションしている。ソート対象たいしょうたてぼうしめしている。
  • Sorting contest - 8種類しゅるいのソートアルゴリズムのアニメーションを一斉いっせい実行じっこうでき、速度そくどちがいを体感たいかんできる。