(57)【要約】【課題】ｎ個のデータから構成された全順序集合を降順又は昇順に並べ替えたのちの上位のｍ個のデータを高速に抽出する。【解決手段】本発明のソーティング方法では、ｎ個のデータから構成された全順序集合の上位からｍ個のデータに対して、降順又は昇順の並べ替えを行う（第１のソーティングステップＳ１）。続いて、第１のソーティングステップ（Ｓ１）により並べ替えをしたのちの全順序集合のうちの上位から（ｍ＋１）個目以降のデータを１つずつ選択していき、選択した１つのデータと全順序集合の上位からｍ個のデータとにより降順又は昇順の並べ替えを行う（第２のソーティングステップＳ２）。【選択図】　図２
2004133301.tif 000002
【特許請求の範囲】
【請求項１】
ｎ個（ｎは２以上の整数）のデータから構成された全順序集合の上位からｍ個（ｍは（ｎ−１）以下の自然数）のデータに対して、降順又は昇順の並べ替えを行う第１のソーティングステップと、
上記第１のソーティングステップにより並べ替えをしたのちの上記全順序集合のうちの上位から（ｍ＋１）個目以降のデータを１つずつ選択していき、選択した１つのデータと全順序集合の上位からｍ個のデータとにより降順又は昇順の並べ替えを行う第２のソーティングステップと
を有することを特徴とするソーティング方法。
【請求項２】
上記第２のソーティングステップでは、全順序集合の上位のｍ個のデータを下位から上位へ１つずつ順番に抽出し、抽出したデータと上記選択した１つのデータとの大小比較を行って、当該データの挿入位置を検出すること
を特徴とする請求項１記載のソーティング方法。
【請求項３】
ｎ個（ｎは２以上の整数）のデータから構成された全順序集合の各データを格納するメモリと、
上記メモリに格納されたデータに対してデータ処理を行うデータ処理手段とを備え、
上記データ処理手段は、
ｎ個のデータから構成された全順序集合の上位からｍ個（ｍは（ｎ−１）以下の自然数）のデータに対して、降順又は昇順の並べ替えを行う第１のソーティング処理と、
上記第１のソーティング処理により並べ替えをしたのちの上記全順序集合のうちの上位から（ｍ＋１）個目以降のデータを１つずつ選択していき、選択した１つのデータと全順序集合の上位からｍ個のデータとで降順又は昇順の並べ替えを行う第２のソーティング処理と
を行うことを特徴とするソーティング装置。
【請求項４】
ｎ個（ｎは２以上の整数）のデータから構成された全順序集合の上位からｍ個（ｍは（ｎ−１）以下の自然数）のデータに対して、降順又は昇順の並べ替えを行う第１のソーティングステップと、
上記第１のソーティングステップにより並べ替えをしたのちの上記全順序集合のうちの上位から（ｍ＋１）個目以降のデータを１つずつ選択していき、選択した１つのデータと全順序集合の上位からｍ個のデータとで降順又は昇順の並べ替えを行う第２のソーティングステップと
を有することを特徴とするソーティングプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、全順序集合内の要素の並べ替えを行うソーティング方法及び装置並びにソーティングプログラムに関する。
【０００２】
【従来の技術】
ＭＰＥＧ−４では、ＣＥＬＰ（Ｃｏｄｅ　Ｅｘｃｉｔｅｄ　Ｌｉｎｅｒ　Ｐｒｅｄｉｃｔｉｖｅ　Ｃｏｄｉｎｇ）コーダと呼ばれるスピーチコーダが採用されている。ＭＰＥＧ−４　ＣＬＥＰでは、過去に生成した音声信号を蓄えておくコードブックを備えており、このコードブック内のデータを利用して符号化を行う。
【０００３】
ＭＰＥＧ−４　ＣＬＥＰでは、図５に示すように、コードブック内に２５６個のデータを有している。ＭＰＥＧ−４　ＣＬＥＰでは、その２５６個のデータに対してソーティングを行い、そのうちの上位の３２個のデータを抽出する処理が行われる。
【０００４】
【発明が解決しようとする課題】
ところで、全順序集合の各要素を昇順又は降順に並べ替えるソーティング方法には、例えば、シェルソート、マージソート並びにクイックソート等、様々な方法がある。これら従来から知られているソーティング方法は、全順序集合の全要素の並べ替えを行うものである。
【０００５】
これに対して、上述したＭＰＥＧ−４　ＣＬＥＰでは、コードブック内の２５６個の全データをソーティングした後の上位の３２個のデータしか必要としていない。つまり、残りの２２４個のデータの並び順は、どのようになっていてもかまわない。
【０００６】
しかしながら、コードブック内のデータの並べ替えにシェルソート等の従来のソーティング方法を採用した場合、２５６個全てのデータに対して並べ替えが行われてしまう。つまり、２５６個の全てのデータが昇順又は降順に並べ替えられてしまう。従って、処理時間が長くなり、また、ソーティング中に必要とするメモリ等も大きくなってしまう。
【０００７】
本発明は、このような従来の実状を鑑みて提案されたものであり、ｎ個のデータから構成された全順序集合を降順又は昇順に並べ替えたのちの上位のｍ個のデータを、高速に抽出することができるソーティング方法及び装置並びにソーティングプログラムを提供することを目的とする。
【０００８】
【課題を解決するための手段】
本発明にかかるソーティング方法及び装置、並びにソーティングプログラムでは、ｎ個（ｎは２以上の整数）のデータから構成された全順序集合の上位からｍ個（ｍは（ｍ−１）以下の自然数）のデータに対して、降順又は昇順に並べ替えを行う第１のソーティング処理を行い、第１のソーティング処理により並べ替えをしたのちの上記全順序集合のうちの上位から（ｍ＋１）個目以降のデータを１つずつ選択していき、選択した１つのデータと全順序集合の上位からｍ個のデータとにより降順又は昇順の並べ替えを行う第２のソーティング処理を行う。
【０００９】
本発明では、第２のソーティング処理によりデータの並べ替えがされたのちの全順序集合の上位からｍ個のデータが、全順序集合の全データを昇順又は降順に並べ替えた後の上位からｍ個のデータと一致している。つまり、本発明では、全順序集合の全データのうち大きい方の値からｍ個又は小さい方の値からｍ個のデータを抽出し、抽出したｍ個のデータを昇順又は降順で並べ替えをして全順序集合の上位から配置している。ただし、本発明では、第２のソーティング処理によりデータの並べ替えがされたのちの全順序集合のｍ＋１個目以降のデータの並び順は保障されていない。
【００１０】
【発明の実施の形態】
以下、本発明の実施の形態として、本発明を適用したソーティング装置について説明をする。本発明の実施の形態のソーティング装置は、例えば、ＭＰＥＧ−４のＣＥＬＰコーダのコードブックのソーティング等に適用することができる。
【００１１】
なお、以下の説明で用いる定数等は、次のように定義される。
Ｕ：複数のデータから構成される全順序集合
ｘ［ｉ］：全順序集合Ｕ内のインデックスｉのデータ（実数値）
ｉ：インデックス（ｉは０以上Ｎ以下の整数値）
ｎ：全順序集合Ｕ内の総データ数（２以上の整数値）
ｍ：抽出データ数（１以上ｎ未満の任意の整数値）
Ｎ：集合Ｕの最下位のインデックス（Ｎ＝ｎ−１）
Ｍ：抽出データ範囲内の最下位のインデックス（Ｍ＝ｍ−１）。
【００１２】
また、インデックスとは、各データに対する当該全順序集合Ｕ内における順序を示す値である。全順序集合Ｕ内の各データには、インデックスとして０からＮまでの整数値が昇順でユニークに割り当てられる。最上位のインデックスは０であり、最下位のインデックスはＮである。従って、例えば全順序集合Ｕ内のデータを降順でソーティングした場合、最大値のインデックスは０となり、最小値のインデックスはＮとなる。
【００１３】
本実施の形態のソーティング装置は、ｍ個のデータから構成される全順序集合Ｕを昇順（或いは降順）に並べ替えを行う。ただし、本実施の形態のソーティング装置は、処理終了後の全順序集合Ｕのｍ個のデータの全てを正確に並べ替えたソーティングを行うのではなく、上位のｍ個のデータ（インデックス０〜インデックスＭ）の並びを保障したソーティングを行うものである。つまり、本実施の形態のソーティング装置によりソーティングが行われたのちの全順序集合Ｕのインデックス０〜インデックスＭの各データは、全順序集合Ｕ内の全てのデータに対してソーティングをしたのちのインデックス０〜インデックスＭのデータと完全一致している。しかしながら、このソーティング装置によりソーティングが行われたのちの全順序集合Ｕのインデックス（Ｍ＋１）〜インデックスＮの各データは、全順序集合Ｕ内の全てのデータを昇順（又は降順）に並べ替えをしたのちのインデックス（Ｍ＋１）〜インデックスＮのデータと一致するとは限らない。
【００１４】
本実施の形態のソーティング装置がデータの並べ替え順序を保障するインデックスの範囲を、抽出データ範囲（インデックス０〜インデックスＭ）と呼び、そのデータ数を抽出データ数ｍという。
【００１５】
図１に本発明の実施の形態のソーティング装置のブロック構成図を示す。
【００１６】
ソーティング装置１は、図１に示すように、ソーティング対象となる全順序集合Ｕを格納するメモリ１１と、全順序集合Ｕを外部からメモリ１１へ入力する入力部１２と、全順序集合Ｕをメモリ１１から外部へ出力する出力部１３と、メモリ１１内の任意のインデックスｉのデータｘ［ｉ］の読み出し及び書き込みを行い、全順序集合Ｕのソーティングを行うデータ処理部１４と、データ処理部１４の演算用に用いられるレジスタ１５とを備えている。
【００１７】
このようなソーティング装置１では、外部から入力部１２を介して全順序集合Ｕが入力され、入力された全順序集合Ｕがメモリ１１内に格納される。データ処理部１４は、所定のプログラムを起動してメモリ１１内に格納されている全順序集合Ｕ内のデータのソーティングを行う。データ処理部１４によりソーティングがされた後の全順序集合Ｕは、出力部１３を介して外部へと出力される。
【００１８】
データ処理部１４が行うソーティング処理の内容について、図２〜図４に示すフローチャートを参照して説明をする。
【００１９】
なお、ソーティング装置１では、昇順（小さい順）のソーティングにも降順（大きい順）のソーティングにも適用することができるが、以下では、降順のソーティングを行う場合の処理例について説明をする。
【００２０】
また、以下の説明で用いる変数は、次のように定義されるものである。これらの変数は、例えば、レジスタ１５内に格納されてデータ処理部１４によりアクセスがされる。
Ｐｍ：メインポインタ：任意のインデックスを指し示す変数
Ｐｓ：サブポインタ　：任意のインデックスを指し示す変数
α：任意のデータの値を格納する変数
β：任意のデータの値を格納する変数。
【００２１】
図２に示すように、データ処理部１４は、第１のソーティング処理（Ｓ１）を行い、その後に、第２のソーティング処理（Ｓ２）を行う。第１のソーティング処理（Ｓ１）において、データ処理部１４は、全順序集合Ｕの抽出データ範囲（インデックス０〜Ｍ）に対して、降順のソーティングを行う。第２のソーティング処理（Ｓ２）において、データ処理部１４は、第１のソーティング処理でソーティングがされなかったインデックスＭ＋１〜Ｎのデータを１つずつ順番に選択していき、選択したデータと全順序集合Ｕのインデックス０〜Ｍのデータとで降順の並べ替えを行う。
【００２２】
まず、第１のソーティング処理（Ｓ１）の処理例を、図３に示すフローチャートを参照して説明をする。
【００２３】
第１のソーティング処理（Ｓ１）には、シェルソートやマージソート等のどのようなソーティングアルゴリズムを適用してもよいが、本例では、隣り合ったデータを比較して大小の順が逆であればそれらの要素を入れ替えていくという操作を繰り返すバブルソートを利用した処理を行っている。
【００２４】
まず、ステップＳ１１において、メインポインタＰｍに１を代入し、メインポインタＰｍを初期化する。
【００２５】
ステップＳ１１でメインポインタＰｍを初期化した後は、ステップＳ１２〜ステップＳ２１のメインループ処理を行う。
【００２６】
メインループ処理（Ｓ１２〜Ｓ２１）では、インデックス１からインデックスＭまで１つずつ順番にデータを選択していき、選択したデータ（以下、対象データと呼ぶ。）の移動先となるインデックスを決定し、そのインデックスに挿入する処理を行う。メインループ処理（Ｓ１２〜Ｓ２１）では、１つの対象データに対する選択及び挿入の処理を、１回のループ処理で行う。メインポインタＰｍは、このメインループ（Ｓ１２〜Ｓ２１）の処理対象となる１つの対象データのインデックスを特定するポインタとなる。なお、メインポインタＰｍは、メインループの最終ステップ（Ｓ２１）で１ずつインクリメントされていくため、対象データは、上位インデックスから下位インデックスへ向かう方向へ、１からＭまで選択されていくこととなる。
【００２７】
メインループの開始ステップとなるステップＳ１２では、Ｐｍ＞Ｍを判断する。Ｐｍ＞Ｍが真であれば第１のソーティング処理（Ｓ１）を終了する。Ｐｍ＞Ｍｍが偽であれば、ステップＳ１３に進みメインループの処理を続行する。メインポインタＰｍは、メインループの終了ステップとなるステップＳ２１で、値が１ずつインクリメントされる。そのため、インデックス１からＭまでの全てのデータに対して選択及び挿入という処理を終えた場合には、メインポインタＰｍの値はＭよりも大きくなる。一方、インデックス１からＭまでの全てのデータに対して選択及び挿入という処理を終えていない場合には、メインポインタＰｍの値はＭ以下となる。従って、メインループの開始ステップとなるこのステップＳ１２でメインポインタＰｍの値を判断すれば、第２のソーティング処理の終了判断をすることできる。
【００２８】
続くステップＳ１３では、αにｘ［Ｐｍ］を代入する。すなわち、メモリ１１内のデータｘ［Ｐｍ］を読み出し、変数αに代入する。
【００２９】
続くステップＳ１４では、サブポインタＰｓに（Ｐｍ−１）を代入して、サブポインタＰｓを初期化する。つまり、サブポインタＰｓに、選択データｘ［Ｐｍ］の１つ上位のインデックスを指定する。
【００３０】
ステップＳ１４でサブポインタＰｓを初期化した後は、ステップＳ１５〜ステップＳ１９のサブループ処理を行う。
【００３１】
サブループ処理（Ｓ１５〜Ｓ１９）では、インデックス（Ｐｍ−１）からインデックス０までのデータを順番に選択していき、選択したデータ（参照データ）と対象データ（ｘ［Ｐｍ］）との大小比較する処理を行い、対象データの移動位置となるインデックスを決定する処理を行う。サブループ処理（Ｓ１５〜Ｓ１９）では、１つの参照データに対する大小比較の処理を、１回のループ処理で行う。サブポインタＰｓは、このサブループ（Ｓ１５〜Ｓ１９）の処理対象となる１つの参照データのインデックスを特定するポインタとなる。なお、サブポインタＰｓの値は、サブループ処理の最終ステップ（Ｓ１９）において、１ずつデクリメントされていくため、参照データは、下位インデックスから上位インデックスへ向かう方向へ、（Ｐｍ−１）から０まで順番に選択されていくこととなる。つまり、サブループ処理では、選択データｘ［Ｐｍ］より上位のインデックスのデータを、１つずつ上位に向けて選択していくこととなる。
【００３２】
サブループの開始ステップとなるステップＳ１５では、Ｐｓ≧０を判断する。Ｐｓ≧０が偽であればサブループ処理（Ｓ１５〜Ｓ１９）を抜けて、ステップＳ２０に進む。Ｐｓ≧０が真であれば、サブループ処理（Ｓ１５〜Ｓ１９）を抜けずに、続くステップＳ１６に進む。サブポインタＰｓは、サブループの終了ステップとなるステップＳ１９で、値が１ずつデクリメントされる。そのため、インデックス（Ｐｍ−１）から０までの全てのデータを参照データとして選択し終えた場合には、サブポインタＰｓの値は０よりも小さくなる。一方、インデックス（Ｐｍ−１）から０までの全てのデータを参照データとして選択し終えていない場合には、サブポインタＰｓの値は０以上となる。従って、サブループの開始ステップとなるこのステップＳ１５でサブポインタＰｓの値を判断すれば、サブループの終了判断をすることができる。
【００３３】
続くステップＳ１６では、βにｘ［Ｐｓ］を代入する。すなわち、メモリ１１内の参照データｘ［Ｐｓ］の値を読み出し、変数βに代入する。
【００３４】
続くステップＳ１７では、α＞βを判断する。つまり、選択データｘ［Ｐｍ］と参照データｘ［Ｐｓ］との大小比較を行う。
【００３５】
ステップＳ１７で大小比較を行った結果、α＞βが真（すなわち、ｘ［Ｐｍ］＞ｘ［Ｐｓ］が真）であれば、サブループ処理（Ｓ１５〜Ｓ１９）を抜けずにステップＳ１８に進む。一方、α＞βが偽（すなわち、ｘ［Ｐｍ］＞ｘ［Ｐｓ］が偽）であれば、サブループ処理（Ｓ１５〜Ｓ１９）を抜けてステップＳ２０に進む。
【００３６】
ここで、参照データとして選択されるインデックス（Ｐｍ−１）からインデックス（０）までのデータは、当該第１のソーティング処理（Ｓ１）が進行していく過程上、必ず降順にデータが並んでいる。このため、このステップＳ１７の判断でα＞βが偽となれば、現在の参照データ（ｘ［Ｐｓ］）を含めてこれより上位のインデックスのデータには、対象データｘ［Ｐｍ］よりも大きいデータは存在しないことが保障される。また、インデックス（Ｐｍ−１）からインデックス（０）までのデータのうち、現在の参照データ（ｘ［Ｐｓ］）を含めずにこれより下位のデータは、すでにα＞βが真であることがわかっているので、対象データｘ［Ｐｍ］よりも小さいことが保障される。つまり、α＞βが偽となったときに、対象データの挿入位置がインデックス（Ｐｓ−１）に決定される。従って、このステップＳ１７でα＞βが偽となったときに、サブループ処理（Ｓ１５〜Ｓ１９）を抜けることができる。また、上記ステップＳ１５でサブループ処理を抜けた場合には、インデックス（Ｐｍ−１）からインデックス（０）までの全てのデータは、対象データｘ［Ｐｍ］よりも小さい、ということとなるので、対象データの挿入位置は、最上位インデックスである０である。
【００３７】
続くステップＳ１８では、ｘ［Ｐｓ＋１］にβを代入する。すなわち、レジスタ１５に格納されている変数βの値を、メモリ１１内のデータｘ［Ｐｓ＋１］に書き込む。つまり、ステップＳ１７でα＞βが真と判断された場合には、対象データｘ［Ｐｍ］が、現在の参照データｘ［Ｐｓ］よりも上位のインデックスに挿入されることになる。従って、現在の参照データｘ［Ｐｓ］のインデックスの位置を１つ下位に移動しなければならないため、このステップＳ１８で変数βの値をｘ［Ｐｓ＋１］に格納している。なお、サブループ処理を進行していく過程上、データｘ［Ｐｓ＋１］の値は必ず変数α又は変数βに退避されているので、このステップＳ１８で、変数βの値をｘ［Ｐｓ＋１］に書き込んでも、データが消去されてしまうことはない。
【００３８】
続くステップＳ１９では、サブポインタＰｓの値を１つデクリメントする。つまり、このステップＳ１９では、大小比較をするための参照データを１つ上位に移動させている。このステップＳ１９での処理を終えると、サブループの開始ステップであるステップＳ１５に戻り、次の参照データに対するサブループの処理を行う。
【００３９】
以上のようにサブループ処理（Ｓ１５〜Ｓ１９）が行われる。サブループ処理が行われた結果、対象データＸ［Ｐｍ］の挿入位置は、インデックス（Ｐｓ−１）となることが決定される。
【００４０】
続いて、ステップＳ２０では、ｘ［Ｐｓ＋１］にαの値を代入する。すなわち、レジスタ１５に格納されている変数αの値をメモリ１１のデータｘ［Ｐｓ＋１］に書き込むことによって、対象データｘ［Ｐｍ］をインデックス（Ｐｓ＋１）に移動している。
【００４１】
続いて、ステップＳ２１では、メインポインタＰｍの値を１つインクリメントする。つまり、このステップＳ２１では、選択データの位置を一つ下位に移動する。
【００４２】
そして、このステップＳ２１での処理を終えると、メインループの開始ステップであるステップＳ１２に戻り、次の選択データに対するループ処理を行う。
【００４３】
データ処理部１４は、以上のステップＳ１１〜Ｓ２１の処理を行うことによって、第１のソーティング処理を完了することできる。つまり、第１のソーティング処理（Ｓ１）において、データ処理部１４は、全順序集合Ｕの抽出データ範囲（インデックス０〜Ｍ）に対して、降順のソーティングを行うことができる。
【００４４】
つぎに、第２のソーティング処理（Ｓ２）の処理例を、図４に示すフローチャートを参照して説明をする。
【００４５】
第２のソーティング処理（Ｓ２）では、第１のソーティング処理でソーティングがされなかったインデックスＭ＋１〜Ｎのデータを１つずつ順番に選択していき、選択したデータと、全順序集合Ｕのインデックス０〜Ｍのデータとの、全部でＭ＋２個のデータで降順の並べ替えを行う。その並べ替えは、シェルソートやマージソート等のどのようなソーティングアルゴリズムを適用してもよいが、本例では、バブルソートを利用した処理を行っている。
【００４６】
まず、ステップＳ３１において、メインポインタＰｍに（Ｍ＋１）を代入し、メインポインタＰｍを初期化する。
【００４７】
ステップＳ１１でメインポインタＰｍを初期化した後は、まず、ステップＳ３２〜ステップＳ３５及びステップＳ４４で形成される第１ループ処理を行う。
【００４８】
第１ループ（Ｓ３１〜Ｓ３５，Ｓ４４）では、インデックス（Ｍ＋１）のデータからインデックスＮのデータまで順番に１つずつデータを選択していき、選択した１つのデータ（対象データ）と、抽出データ範囲（インデックス０〜Ｍ）内の最下位のデータｘ［Ｍ］とのデータの大小比較をする処理を行う。そして、抽出データ範囲の最下位データｘ［Ｍ］よりも対象データ［Ｐｍ］が大きい場合にのみ、続く第２ループ処理（Ｓ３６〜Ｓ４４）を行う。第２ループ（Ｓ３６〜Ｓ４４）では、対象データの移動先のインデックスを決定し、決定したインデックスに対象データを挿入する処理を行う。
【００４９】
すなわち、第２のソーティング処理の過程上、抽出データ範囲（インデックス０〜Ｍ）のデータは必ず降順にデータが並んでいる。このため、第２のソーティング処理（Ｓ２）では、まず、第１ループで、対象データｘ［Ｐｍ］と、抽出データ範囲の最下位データｘ［Ｍ］との大小判断を行い、対象データｘ［Ｐｍ］が最下位データｘ［Ｍ］よりも大きい場合にのみ、続く第２ループ（Ｓ３６〜Ｓ４４）を行うようにしている。
【００５０】
第１ループ（Ｓ３２〜Ｓ３５，Ｓ４４）及び第２ループ（Ｓ３６〜Ｓ４４）では、１つの対象データに対する大小比較処理を１回のループ処理で行う。メインポインタＰｍは、第１ループ及び第２ループの処理対象となる１つの対象データのインデックスを特定するポインタとなる。なお、メインポインタＰｍは、第１ループ及び第２ループの最終ステップ（Ｓ４４）で１ずつインクリメントされるため、対象データは、上位インデックスから下位インデックスへ向かう方向へ、（Ｍ＋１）からＮまで選択されていくこととなる。
【００５１】
第１ループの開始ステップとなるステップＳ３２では、Ｐｍ＞Ｎを判断する。Ｐｍ＞Ｎが真であれば第２のソーティング処理（Ｓ２）を終了する。Ｐｍ＞Ｎが偽であれば、ステップＳ３３に進み第１ループの処理を続行する。メインポインタＰｍは、第１ループ及び第２ループの終了ステップとなるステップＳ４４で、値が１ずつインクリメントされる。そのため、インデックス（Ｍ＋１）〜Ｎまでの全てのデータに対して処理を終えた場合には、メインポインタＰｍの値はＮよりも大きくなる。一方、インデックス（Ｍ＋１）〜Ｎまでの全てのデータに対して処理を終えていない場合には、メインポインタＰｍの値はＮ以下となる。従って、第１ループの開始ステップとなるこのステップＳ３２でメインポインタＰｍの値を判断すれば、第２のソーティング処理（Ｓ２）の終了判断をすることできる。
【００５２】
続くステップＳ３３では、αにｘ［Ｐｍ］を代入する。すなわち、メモリ１１内の対象データｘ［Ｐｍ］を読み出し、変数αに代入する。
【００５３】
続くステップＳ３４では、βにｘ［Ｍ］を代入する。すなわち、メモリ１１内の抽出データ範囲の最下位データｘ［Ｍ］を読み出し、変数βに代入する。
【００５４】
続くステップＳ３５では、α＞βを判断する。つまり、選択データｘ［Ｐｍ］と抽出データ範囲の最下位データｘ［Ｍ］との大小比較を行う。
【００５５】
ステップＳ３５で大小比較を行った結果、α＞βが真（すなわち、ｘ［Ｐｍ］＞ｘ［Ｍ］が真）であれば、ステップＳ３６以降の第２ループに進む。一方、ステップＳ３５で大小比較を行った結果、α＞βが偽（すなわち、ｘ［Ｐｍ］＞ｘ［Ｍ］が偽）であれば、ステップＳ４４でメインポインタＰｍを１インクリメントし、ステップＳ３２から第１ループの処理を繰り返して行う。
【００５６】
第２ループの開始ステップとなるステップＳ３６では、ｘ［Ｐｍ］にβの値を代入する。すなわち、レジスタ１５に格納されている変数βの値をメモリ１１内のデータｘ［Ｐｍ］に書き込む。つまり、ステップＳ３５でα＞βが真と判断された場合には、対象データｘ［Ｐｍ］が必ず抽出データ範囲内のいずれかのインデックス位置に挿入されることとなる。従って、抽出データ範囲の最下位データｘ［Ｎ］を、対象データのインデックス位置に移動して、対象データの移動先を確保する。
【００５７】
続くステップＳ３７では、サブポインタＰｓに（Ｍ−１）を代入して、サブポインタＰｓを初期化する。
【００５８】
ステップＳ３７でサブポインタＰｓを初期化した後は、ステップＳ３８〜ステップＳ４２のサブループ処理を行う。
【００５９】
サブループ処理（Ｓ３８〜Ｓ４２）では、インデックス（Ｍ−１）からインデックス０までのデータを順番に選択していき、選択したデータ（参照データ）と対象データ（ｘ［Ｐｍ］）との大小比較する処理を行い、対象データの移動位置となるインデックスを決定する処理を行う。サブループ処理（Ｓ３８〜Ｓ４２）では、１つの参照データに対する大小比較の処理を、１回のループ処理で行う。サブポインタＰｓは、このサブループ（Ｓ３８〜Ｓ４２）の処理対象となる１つの参照データのインデックスを特定するポインタとなる。なお、サブポインタＰｓは、サブループ処理の最終ステップ（Ｓ４２）において、１ずつデクリメントされていくため、参照データは、下位インデックスから上位インデックスへ向かう方向へ、（Ｍ−１）から０まで選択されていくこととなる。
【００６０】
サブループの開始ステップとなるステップＳ３８では、Ｐｓ≧０を判断する。Ｐｓ≧０が偽であればサブループ処理（Ｓ３８〜Ｓ４２）を抜けて、ステップＳ４３に進む。Ｐｓ≧０が真であれば、サブループ処理（Ｓ３８〜Ｓ４２）を抜けずに、続くステップＳ３９に進む。サブポインタＰｓは、サブループの終了ステップとなるステップＳ４２で、値が１ずつデクリメントされる。そのため、インデックス（Ｍ−１）から０までの全てのデータを参照データとして選択し終えた場合には、サブポインタＰｓの値は０よりも小さくなる。一方、インデックス（Ｍ−１）〜０までの全てのデータを参照データとして選択し終えていない場合には、サブポインタＰｓの値は０以上となる。従って、サブループの開始ステップとなるこのステップＳ３８でサブポインタＰｓの値を判断すれば、サブループの終了判断をすることができる。
【００６１】
続くステップＳ３９では、βにｘ［Ｐｓ］を代入する。すなわち、メモリ１１内の参照データｘ［Ｐｓ］を読み出し、変数βに代入する。
【００６２】
続くステップＳ４０では、α＞βを判断する。つまり、選択データｘ［Ｐｍ］と参照データｘ［Ｐｓ］との大小比較を行う。
【００６３】
ステップＳ４０で大小比較を行った結果、α＞βが真（すなわち、ｘ［Ｐｍ］＞ｘ［Ｐｓ］が真）であれば、サブループ処理（Ｓ３８〜Ｓ４２）を抜けずにステップＳ４１に進む。一方、α＞βが偽（すなわち、ｘ［Ｐｍ］＞ｘ［Ｐｓ］が偽）であれば、サブループ処理（Ｓ３８〜Ｓ４２）を抜けてステップＳ４３に進む。
【００６４】
続くステップＳ４２では、ｘ［Ｐｓ＋１］にβを代入する。すなわち、レジスタ１５に格納されている変数βの値をメモリ１１内のデータｘ［Ｐｓ＋１］に書き込む。つまり、ステップＳ４０でα＞βが真と判断された場合には、対象データｘ［Ｐｍ］が、現在の参照データｘ［Ｐｓ］よりも上位のインデックスに挿入されることになる。従って、参照データｘ［Ｐｓ］のインデックスの位置を１つ下位に移動しなければならないため、このステップＳ４１で変数βの値をｘ［Ｐｓ＋１］に格納している。
【００６５】
続くステップＳ４２では、サブポインタＰｓの値を１つデクリメントさせている。つまり、このステップＳ４２では、大小比較をするための参照データを１つ上位に移動させている。このステップＳ４２での処理を終えると、サブループの開始ステップであるステップＳ３８に戻り、次の参照データに対するサブループの処理を行う。
【００６６】
以上のようにサブループ処理（Ｓ３８〜Ｓ４２）が行われる。サブループ処理が行われた結果、対象データＸ［Ｐｍ］の挿入位置は、インデックス（Ｐｓ−１）となる。
【００６７】
続いて、ステップＳ４３では、ｘ［Ｐｓ＋１］にαの値を代入する。すなわち、レジスタ１５に格納されている変数αをメモリ１１内のｘ［Ｐｓ＋１］に書き込むことによって、対象データｘ［Ｐｍ］をインデックスｘ［Ｐｍ＋１］に移動している。
【００６８】
続いて、ステップＳ４４では、メインポインタＰｍの値を１つインクリメントする。つまり、このステップＳ４４では、選択データの位置を一つ下位に移動する。
【００６９】
そして、このステップＳ４４での処理を終えると、第１ループの開始ステップであるステップＳ３２に戻り、次の選択データに対するループ処理を行う。
【００７０】
データ処理部１４は、以上のステップＳ３１〜Ｓ４４の処理を行うことによって、第２のソーティング処理を完了することできる。つまり、データ処理部１４は、第２のソーティング処理（Ｓ２）では、全順序集合Ｕの抽出データ範囲（インデックス０〜Ｍ）内のみのデータの保障を行った、降順のソーティングを行うことができる。
【００７１】
以上のように本実施の形態のソーティング装置１では、第１のソーティング処理（Ｓ１）を行い、続いて、第２のソーティング処理を行うことによって、インデックス０〜インデックスＭまでの並びを保障した全順序集合Ｕのソーティングを行うことができる。
【００７２】
なお、図３及び図４のフローチャートでは、降順に並べ替える処理を例にとって説明をしたが、本実施の形態のソーティング装置１では、降順に限らず、昇順のソーティングも行うことができる。昇順のソーティングを行う場合には、ステップＳ１７、ステップＳ３５及びステップＳ４０でα＜βの判断を行えばよい。
【００７３】
【発明の効果】
本発明にかかるソーティング方法及び装置並びにソーティングプログラムでは、第１のソーティングステップで全順序集合の上位からｍ個のデータに対して降順又は昇順の並べ替えを行い、第２のソーティングステップで、第１のソーティングステップにより並べ替えをしたのちの上記全順序集合のうちの上位から（ｍ＋１）個目以降のデータを１つずつ選択していき、選択した１つのデータと全順序集合の上位からｍ個のデータとにより降順又は昇順の並べ替えを行う。
【００７４】
本発明では、第２のソーティング処理によりデータの並べ替えがされたのちの全順序集合の上位からｍ個のデータが、全順序集合の全データを昇順又は降順に並べ替えた後の上位からｍ個のデータと一致している。つまり、本発明では、全順序集合の全データのうち大きい方の値からｍ個又は小さい方の値からｍ個のデータを抽出し、抽出したｍ個のデータを昇順又は降順で並べ替えをして全順序集合の上位から配置している。
【００７５】
従って、本発明では、ｎ個のデータから構成された全順序集合を降順又は昇順に並べ替えたのちの上位のｍ個のデータを、高速に抽出することができる。
【図面の簡単な説明】
【図１】本発明の実施の形態のソーティング装置のブロック構成図である。
【図２】上記ソーティング装置の処理手順を示したフローチャートである。
【図３】第１のソーティング処理の具体的な処理手順を示したフローチャートである。
【図４】第２のソーティング処理の具体的な処理手順を示したフローチャートである。
【図５】ＭＰＥＧ−４のＣＥＬＰコーダにより行われるソーティング範囲について説明をするための図である。
【符号の説明】
１　ソーティング装置、１１　メモリ、１２　入力部、１３　出力部、１４　データ処理部、１５　レジスタ
【図１】
2004133301.tif 000003
【図２】
2004133301.tif 000004
【図３】
2004133301.tif 000005
【図４】
2004133301.tif 000006
【図５】
2004133301.tif 000007