(57)【要約】【課題】処理時間が高速かつ一定で、少ないメモリ使用量でソートを実現する。【解決手段】Ｎ個のデータに対し、２データ、４データ、・・・、Ｎデータの並び替えを再帰的に行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行い（Ｓ１０４）、第２のデータ列に対してソートを実施する（Ｓ１０５）。ブロック交換マージは、ｎ個（ｎ＝１，２，・・・，Ｎ／２）の第１のデータ列と隣接するｎ個の第２のデータ列について、第１のデータ列のｍ番目のデータと第２のデータ列の１番目のデータとを大小比較し、第２のデータ列の１番目のデータの方が小さいときに、第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータを交換する処理を、ｍ＝１からｍ＝ｎまで行う処理である。【選択図】  図８
2016091488.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵと記憶装置とを備えたデータソート装置においてＮ個（Ｎ＝２kの整数で、ｋは１以上の整数）のデータのソートを行うデータソート方法において、
２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、
前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が小さいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするデータソート方法。
【請求項２】
ＣＰＵと記憶装置とを備えたデータソート装置においてＮ個（Ｎ＝２kの整数で、ｋは１以上の整数）のデータのソートを行うデータソート方法において、
２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、
前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が大きいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするデータソート方法。
【請求項３】
ＣＰＵと記憶装置とを備えたコンピュータをデータソート装置として機能させ、Ｎ個（Ｎ＝２kの整数で、ｋは１以上の整数）のデータのソートを行うデータソートプログラムにおいて、
２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、
前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が小さいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするデータソートプログラム。
【請求項４】
ＣＰＵと記憶装置とを備えたコンピュータをデータソート装置として機能させ、Ｎ個（Ｎ＝２kの整数で、ｋは１以上の整数）のデータのソートを行うデータソートプログラムにおいて、
２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、
前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が大きいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするデータソートプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データを昇順または降順に並び替えるデータソート方法およびプログラムに関するものである。
【背景技術】
【０００２】
データを昇順または降順に並び替えるソート作業はあらゆる分野で必要である。例えば電磁流量計では多重レンジの判定で設定データの並べ替えが必要であり、処理に時間がかかっていた。このようなソートを実現するアルゴリズムは従来から多数提案されている（非特許文献１参照）。
【０００３】
通常、処理時間が一定で確実なソートアルゴリズムとしては総当たり方式が使われるが、この総当たり方式は、要素の数が大きくなると非常に時間がかかる。総当たり方式を高速化したソートアルゴリズムとしてはクイックソートがあるが、クイックソートは、データの比較回数がデータの並びに依存するため、最悪の場合、総当たり方式と変わらない比較回数になってしまうことがある。また、クイックソートは、処理時間が一定でないため、リアルタイムで動くシステムに適用することが難しいという問題点があった。
【０００４】
また、別のソートアルゴリズムとして、図１４に示すようにツリー状にデータを分割して下位から個別にソートした後２つのデータ列をマージする作業を繰り返すというマージソートが知られている（非特許文献２参照）。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】“ソート”，ウィキペディア，＜http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88＞
【非特許文献２】“Ｃ言語講座  マージソート”，ＹＦプロ，＜http://www1.cts.ne.jp/~clab/hsample/Sort/Sort6.html＞
【発明の概要】
【発明が解決しようとする課題】
【０００６】
以上のように、従来からソートアルゴリズムは数々提案されているが、組み込み機器に実装できるようなコンパクトで、ワークメモリを使用せず、処理時間が一定で、高速なものがないという問題点があった。
【０００７】
上記のとおり、クイックソートは、データの比較回数がデータの並びに依存するため、処理時間が一定でなく、リアルタイムで動くシステムに実装することが難しいという問題点があった。また、マージソートは、データ列をマージする際、データの格納された領域と同じサイズのワークメモリが必要なため、組み込み機器などメモリ使用量に制約のあるシステムに実装することが難しいという問題点があった。
【０００８】
本発明は、上記課題を解決するためになされたもので、処理時間が高速かつ一定で、プログラムサイズが小さく、少ないメモリ使用量で実現することができるデータソート方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明は、ＣＰＵと記憶装置とを備えたデータソート装置においてＮ個（Ｎ＝２kの整数で、ｋは１以上の整数）のデータのソートを行うデータソート方法において、２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が小さいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするものである。
【００１０】
また、本発明のデータソート方法は、２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が大きいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするものである。
【００１１】
また、本発明は、ＣＰＵと記憶装置とを備えたコンピュータをデータソート装置として機能させ、Ｎ個（Ｎ＝２kの整数で、ｋは１以上の整数）のデータのソートを行うデータソートプログラムにおいて、２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が小さいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするものである。
【００１２】
また、本発明のデータソートプログラムは、２データ、４データ、８データ、・・・、Ｎデータの並び替えを再帰的にツリー構造で行うマージソートで２つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第２のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記ＣＰＵに実行させ、前記ブロック交換マージは、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、前記第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと前記第２のデータ列の１番目のデータとを大小比較し、前記第２のデータ列の１番目のデータの方が大きいときに、前記第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと前記第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理であることを特徴とするものである。
【発明の効果】
【００１３】
本発明によれば、処理時間が高速かつ一定で、プログラムサイズが小さく、ワークメモリを使用せず、少ないメモリ使用量で実行可能なデータソート方法を実現することができる。本発明のデータソート方法は、データの比較回数が一定であり、処理時間が一定のため、リアルタイムで動くシステムに実装することができる。また、本発明のデータソート方法は、ワークメモリを必要としないため、組み込み機器などメモリ使用量に制約のあるシステムに実装することができる。
【図面の簡単な説明】
【００１４】
【図１】本発明の実施の形態に係るデータソート装置の構成を示すブロック図である。
【図２】本発明の実施の形態に係るデータソート方法の概念を説明する図である。
【図３】本発明の実施の形態における２データの並び替え後のマージ処理を説明する図である。
【図４】本発明の実施の形態における４データの並び替え後のマージ処理を説明する図である。
【図５】本発明の実施の形態における８データの並び替え後のマージ処理を説明する図である。
【図６】本発明の実施の形態における１６データの並び替え後のマージ処理を説明する図である。
【図７】本発明の実施の形態におけるＮデータの並び替え後のマージ処理を説明する図である。
【図８】本発明の実施の形態に係るデータソート方法を説明するフローチャートである。
【図９】本発明の実施の形態に係るブロック交換マージを説明するフローチャートである。
【図１０】本発明の実施の形態におけるデータソートの１例を示す図である。
【図１１】本発明の実施の形態におけるデータソートの１例を示す図である。
【図１２】本発明の実施の形態に係るデータソート方法の処理をＣ言語で記述したプログラムを示す図である。
【図１３】従来のマージソート方法の処理をＣ言語で記述したプログラムを示す図である。
【図１４】従来のマージソートの概念を説明する図である。
【発明を実施するための形態】
【００１５】
以下、本発明の実施の形態について図面を参照して説明する。図１は本発明の実施の形態に係るデータソート装置の構成を示すブロック図である。データソート装置１は、プロセッサや記憶装置からなるハードウェアと、これらのハードウェアと協働して各種機能を実現させるプログラムとによって実現される。
【００１６】
図１において、１−１はＣＰＵ、１−２はＲＡＭ、１−３はＲＯＭ、１−４はハードディスク装置、１−５，１−６はインターフェイス（Ｉ／Ｆ）である。ＣＰＵ１−１は、Ｉ／Ｆ１−５を介して与えられるデータを得て、ＲＡＭ１−２にアクセスしながら、ＲＯＭ１−３やハードディスク装置１−４等の記憶装置に格納されたプログラムに従って以下の処理を実行し、ソート結果をＩ／Ｆ１−６を介して出力する。
【００１７】
本実施の形態のソートプログラムは、予めＲＯＭ１−３に記録されている。なお、ソートプログラムは、例えばＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、メモリカードなどの記録媒体に記録された状態で提供され、この記録媒体から読み出されてハードディスク装置１−４にインストールされる形態であってもよい。
【００１８】
なお、図１のデータソート装置１の構成は１例であって、データソート装置１をコントローラ等の機器に組み込む場合と、ＰＣ（Personal Computer）で実現する場合とでは構成が異なることは言うまでもない。いずれの場合においても、ハードウェアとソフトウェアの協働によって本実施の形態のデータソート方法が実現される。
【００１９】
図２は本実施の形態のデータソート方法の概念を説明する図である。本実施の形態では、２つの並び終えたｎ個（ｎは１以上の整数で、ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと第２のデータ列の１番目のデータとを大小比較し、第２のデータ列の１番目のデータの方が小さいときに、第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理をマージ処理（ブロック交換マージ）とする。Ｎはデータ全体の個数である（Ｎ＝２kの整数で、ｋは１以上の整数）。
【００２０】
図２の例では、ｎ＝１個の第１のデータ列１００とこれに隣接するｎ＝１個の第２のデータ列１０１とについて並び替えを行い、２つのデータ列をマージして、ｎ＝２個の第１のデータ列２００とこれに隣接するｎ＝２個の第２のデータ列２０１とについて並び替えを行い、２つのデータ列をマージして、ｎ＝４個の第１のデータ列３００とこれに隣接するｎ＝４個の第２のデータ列３０１とについて並び替えを行い、２つのデータ列をマージして、ｎ＝８個の第１のデータ列４００とこれに隣接するｎ＝８個の第２のデータ列４０１とについて並び替えを行い、２つのデータ列をマージするという処理を繰り返す。
【００２１】
例えばＮ＝１６の場合、１６データの並び替えの前に８データの並び替えが必要で、８データの並び替えの前に４データの並び替えが必要で、４データの並び替えの前に２データの並び替えが必要である。
図３は２データの並び替え（ｎ＝１個の第１のデータ列１００とｎ＝１個の第２のデータ列１０１の並び替え）後のマージ処理を説明する図である。２データの並び替えでは、ｎ＝１個の第１のデータ列１００とｎ＝１個の第２のデータ列１０１とを比較して、第２のデータ列１０１の方が小さいときに第１のデータ列１００と第２のデータ列１０１とを交換することになる。
【００２２】
図４（Ａ）〜図４（Ｃ）は４データの並び替え（ｎ＝２個の第１のデータ列２００とｎ＝２個の第２のデータ列２０１の並び替え）後のマージ処理を説明する図である。４データの並び替え後のマージ処理では、ｎ＝２個の第１のデータ列２００の１番目のデータとｎ＝２個の第２のデータ列２０１の１番目のデータとを大小比較し、第２のデータ列２０１の１番目のデータの方が小さいときに、第１のデータ列２００の１番目以降の｛ｎ−（ｍ−１）｝＝２個のデータと第２のデータ列２０１の１番目以降の｛ｎ−（ｍ−１）｝＝２個のデータとを交換する（図４（Ａ））。
【００２３】
続いて、第１のデータ列２００の２番目のデータと第２のデータ列２０１の１番目のデータとを大小比較し、第２のデータ列２０１の１番目のデータの方が小さいときに、第１のデータ列２００の２番目以降の｛ｎ−（ｍ−１）｝＝１個のデータと第２のデータ列２０１の１番目以降の｛ｎ−（ｍ−１）｝＝１個のデータとを交換する（図４（Ｂ））。さらに、第２のデータ列２０１に対して２データの並び替え処理を行う（図４（Ｃ））。
【００２４】
図５（Ａ）〜図５（Ｅ）は８データの並び替え（ｎ＝４個の第１のデータ列３００とｎ＝４個の第２のデータ列３０１の並び替え）後のマージ処理を説明する図である。８データの並び替え後のマージ処理では、ｎ＝４個の第１のデータ列３００の１番目のデータとｎ＝４個の第２のデータ列３０１の１番目のデータとを大小比較し、第２のデータ列３０１の１番目のデータの方が小さいときに、第１のデータ列３００の１番目以降の｛ｎ−（ｍ−１）｝＝４個のデータと第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝＝４個のデータとを交換する（図５（Ａ））。
【００２５】
次に、第１のデータ列３００の２番目のデータと第２のデータ列３０１の１番目のデータとを大小比較し、第２のデータ列３０１の１番目のデータの方が小さいときに、第１のデータ列３００の２番目以降の｛ｎ−（ｍ−１）｝＝３個のデータと第２のデータ列３０１の１番目以降の｛ｎ−（ｍ−１）｝＝３個のデータとを交換する（図５（Ｂ））。続いて、第１のデータ列３００の３番目のデータと第２のデータ列３０１の１番目のデータとを大小比較し、第２のデータ列３０１の１番目のデータの方が小さいときに、第１のデータ列３００の３番目以降の｛ｎ−（ｍ−１）｝＝２個のデータと第２のデータ列３０１の１番目以降の｛ｎ−（ｍ−１）｝＝２個のデータとを交換する（図５（Ｃ））。
【００２６】
さらに、第１のデータ列３００の４番目のデータと第２のデータ列３０１の１番目のデータとを大小比較し、第２のデータ列３０１の１番目のデータの方が小さいときに、第１のデータ列３００の４番目以降の｛ｎ−（ｍ−１）｝＝１個のデータと第２のデータ列３０１の１番目以降の｛ｎ−（ｍ−１）｝＝１個のデータとを交換する（図５（Ｄ））。最後に、第２のデータ列３０１に対して４データの並び替え処理を行う（図５（Ｅ））。
【００２７】
図６（Ａ）〜図６（Ｇ）は１６データの並び替え（ｎ＝８個の第１のデータ列４００とｎ＝８個の第２のデータ列４０１の並び替え）後のマージ処理を説明する図である。１６データの並び替え後のマージ処理では、ｎ＝８個の第１のデータ列４００の１番目のデータとｎ＝８個の第２のデータ列４０１の１番目のデータとを大小比較し、第２のデータ列４０１の１番目のデータの方が小さいときに、第１のデータ列４００の１番目以降の｛ｎ−（ｍ−１）｝＝８個のデータと第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝＝８個のデータとを交換する（図６（Ａ））。
【００２８】
次に、第１のデータ列４００の２番目のデータと第２のデータ列４０１の１番目のデータとを大小比較し、第２のデータ列４０１の１番目のデータの方が小さいときに、第１のデータ列４００の２番目以降の｛ｎ−（ｍ−１）｝＝７個のデータと第２のデータ列４０１の１番目以降の｛ｎ−（ｍ−１）｝＝７個のデータとを交換する（図６（Ｂ））。続いて、第１のデータ列４００の３番目のデータと第２のデータ列４０１の１番目のデータとを大小比較し、第２のデータ列４０１の１番目のデータの方が小さいときに、第１のデータ列４００の３番目以降の｛ｎ−（ｍ−１）｝＝６個のデータと第２のデータ列４０１の１番目以降の｛ｎ−（ｍ−１）｝＝６個のデータとを交換する（図６（Ｃ））。
【００２９】
さらに、第１のデータ列４００の４番目のデータと第２のデータ列４０１の１番目のデータとを大小比較し、第２のデータ列４０１の１番目のデータの方が小さいときに、第１のデータ列４００の４番目以降の｛ｎ−（ｍ−１）｝＝５個のデータと第２のデータ列４０１の１番目以降の｛ｎ−（ｍ−１）｝＝５個のデータとを交換する（図６（Ｄ））。同様の処理を繰り返し、第１のデータ列４００の８番目のデータと第２のデータ列４０１の１番目のデータとを大小比較し、第２のデータ列４０１の１番目のデータの方が小さいときに、第１のデータ列４００の８番目以降の｛ｎ−（ｍ−１）｝＝１個のデータと第２のデータ列４０１の１番目以降の｛ｎ−（ｍ−１）｝＝１個のデータとを交換する（図６（Ｅ））。これで、第１のデータ列４００の順番は確定する（図６（Ｆ））。最後に、第２のデータ列４０１に対して８データの並び替え処理を行う（図６（Ｇ））。
【００３０】
図７（Ａ）〜図７（Ｇ）はＮデータの並び替え（ｎ＝Ｎ／２個の第１のデータ列５００とｎ＝Ｎ／２個の第２のデータ列５０１の並び替え）後のマージ処理を説明する図である。この場合のマージ処理も上記と同様なので、詳細な説明は省略する。
【００３１】
次に、図８を用いて本実施の形態のデータソート方法を詳細に説明する。図８において、「ｓｏｒｔｎ（ｐ，ｎ）」のｐはデータ列の先頭を表し、ｎはデータ数を表す。
まず、ＣＰＵ１−１は、データを第１のデータ列と第２のデータ列に分割する（図８ステップＳ１００）。なお、ステップＳ１００の「ｎ＝ｎ／２」における右辺のｎは分割前のデータ数を表しており、左辺のｎは分割後の第１のデータ列と第２のデータ列のそれぞれのデータ数を表している。したがって、ステップＳ１００以降の処理のｎは分割後のデータ数となる。
【００３２】
次に、ＣＰＵ１−１は、分割後のｎが１より小さいかどうかを判定する（図８ステップＳ１０１）。分割後のｎが１以上の場合、ＣＰＵ１−１は、ｎ個の第１のデータ列を昇順に並び替えるソートを行い（図８ステップＳ１０２）、ｎ個の第２のデータ列を昇順に並び替えるソートを行う（図８ステップＳ１０３）。ステップＳ１０３におけるｐ＋ｎは第２のデータ列を表している。
【００３３】
続いて、ＣＰＵ１−１は、ｎ個の第１のデータ列とｎ個の第２のデータ列をマージ（上記のブロック交換マージ）する（図８ステップＳ１０４）。さらに、ＣＰＵ１−１は、ｎ個の第２のデータ列をソートする（図８ステップＳ１０５）。第２のデータ列のソート終了後、次の処理に移る（図８ステップＳ１０６）。また、ステップＳ１０１において、分割後のｎが１より小さい場合も次の処理に移る（図８ステップＳ１０７）。
【００３４】
図９は本実施の形態のブロック交換マージ（ステップＳ１０４）を説明するフローチャートである。図９において、「ｍｅｒｇｅ（ｐ，ｎ）」のｐはデータ列の先頭を表し、ｎはデータ数を表す。ブロック交換マージにおいて、ＣＰＵ１−１は、第１のデータ列のデータに付与する番号ｉを０に初期化する（図９ステップＳ２００）。
【００３５】
次に、ＣＰＵ１−１は、ｎ個の第１のデータ列ｐ［０］〜ｐ［ｎ−１］とこれに隣接するｎ個の第２のデータ列ｐ［ｎ］〜ｐ［２ｎ−１］とについて、第１のデータ列の１番目（ｉ＝０）のデータｐ［０］と第２のデータ列の１番目のデータｐ［ｎ］とを大小比較する（図９ステップＳ２０１）。ＣＰＵ１−１は、第２のデータ列の１番目のデータｐ［ｎ］の方が小さいときに、ブロック交換するデータを決定するための変数ｊを０に初期化し（図９ステップＳ２０２）、第１のデータ列の１番目（０＋０＝０）のデータｐ［０］と第２のデータ列の１番目のデータｐ［ｎ＋０］とを交換する（図９ステップＳ２０３）。
【００３６】
続いて、ＣＰＵ１−１は、変数ｊを１増やし（図９ステップＳ２０４）、変数ｊが（ｎ−ｉ）以上であれば（図９ステップＳ２０５においてＹＥＳ）、ステップＳ２０６に進み、変数ｊが（ｎ−ｉ）未満であれば（ステップＳ２０５においてＮＯ）、ステップＳ２０３に戻る。変数ｊが（ｎ−ｉ）未満である場合、ＣＰＵ１−１は、第１のデータ列の２番目（０＋１＝１）のデータｐ［１］と第２のデータ列の２番目のデータｐ［ｎ＋１］とを交換する（ステップＳ２０３）。
【００３７】
ＣＰＵ１−１は、変数ｊを１増やし（ステップＳ２０４）、変数ｊが（ｎ−ｉ）未満であれば、第１のデータ列の３番目（０＋２＝２）のデータｐ［２］と第２のデータ列の３番目のデータｐ［ｎ＋２］とを交換する（図９ステップＳ２０３）。こうして、変数ｊが（ｎ−ｉ）以上となるまで、ステップＳ２０３〜Ｓ２０５の処理を繰り返す。このステップＳ２０３〜Ｓ２０５の繰り返しは、第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理に相当する。
【００３８】
次に、ＣＰＵ１−１は、ステップＳ２０５において変数ｊが（ｎ−ｉ）以上の場合、変数ｉを１増やし（図９ステップＳ２０６）、変数ｉがｎ未満の場合（図９ステップＳ２０７において判定ＮＯ）、ステップＳ２０１に戻る。
【００３９】
ＣＰＵ１−１は、ｎ個の第１のデータ列ｐ［０］〜ｐ［ｎ−１］とｎ個の第２のデータ列ｐ［ｎ］〜ｐ［２ｎ−１］とについて、第１のデータ列の２番目（ｉ＝１）のデータｐ［１］と第２のデータ列の１番目のデータｐ［ｎ］とを大小比較する（ステップＳ２０１）。ＣＰＵ１−１は、第２のデータ列の１番目のデータｐ［ｎ］の方が小さいときに、変数ｊを０に初期化し（ステップＳ２０２）、第１のデータ列の２番目（１＋０＝１）のデータｐ［０］と第２のデータ列の１番目のデータｐ［ｎ＋０］とを交換する（ステップＳ２０３）。
【００４０】
続いて、ＣＰＵ１−１は、変数ｊを１増やし（ステップＳ２０４）、変数ｊが（ｎ−ｉ）未満であれば（ステップＳ２０５において判定ＮＯ）、第１のデータ列の３番目（１＋１＝２）のデータｐ［２］と第２のデータ列の２番目のデータｐ［ｎ＋１］とを交換する（ステップＳ２０３）。
【００４１】
ＣＰＵ１−１は、変数ｊを１増やし（ステップＳ２０４）、変数ｊが（ｎ−ｉ）未満であれば、第１のデータ列の４番目（１＋２＝３）のデータｐ［３］と第２のデータ列の３番目のデータｐ［ｎ＋２］とを交換する（ステップＳ２０３）。こうして、変数ｊが（ｎ−ｉ）以上となるまで、ステップＳ２０３〜Ｓ２０５の処理を繰り返す。
【００４２】
次に、ＣＰＵ１−１は、ステップＳ２０５において変数ｊが（ｎ−ｉ）以上の場合、変数ｉを１増やし（ステップＳ２０６）、変数ｉがｎ未満の場合（ステップＳ２０７において判定ＮＯ）、ステップＳ２０１に戻る。こうして、変数ｉがｎ以上となるまで、ステップＳ２０１〜Ｓ２０７の処理を繰り返し実行する。このステップＳ２０１〜Ｓ２０７の繰り返しは、データの比較交換を、ｍ＝１からｍ＝ｎまで順次行う処理に相当する。変数ｉがｎ以上となった時点で、ブロック交換マージを終える（図９ステップＳ２０８）。
【００４３】
次に、本実施の形態のデータソート方法の実例を図１０（Ａ）〜図１０（Ｎ）、図１１（Ａ）〜図１１（Ｆ）を用いて説明する。ここでは、Ｎ＝２k＝２3＝８個で、図１０（Ａ）に示すように「８，３，５，１，７，４，６，２」という並びのデータをソートする例について説明する。
【００４４】
図１０（Ｂ）は図１０（Ａ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝１個の第１のデータ列「８」を並び替え、ステップＳ１０３のソート処理によりｎ＝１個の第２のデータ列「３」を並び替え、ステップＳ１０４のブロック交換マージにより「８」と「３」とを交換し、さらにステップＳ１０５のソート処理により第２のデータ列「８」を並び替えた後の状態を示している。なお、ｎ＝１なので、実際にはステップＳ１０２，Ｓ１０３，Ｓ１０５のソート処理は行われないことは言うまでもない。
【００４５】
図８においては、ｎ＝１個の第１のデータ列「８」とｎ＝１個の第２のデータ列「３」について、ステップＳ１０２〜Ｓ１０５の処理が終了した後に、ステップＳ１０６のｒｅｔｕｒｎで次の処理、すなわちｎ＝１個の第１のデータ列「５」とｎ＝１個の第２のデータ列「１」についての処理が行われる。
【００４６】
図１０（Ｃ）は図１０（Ｂ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝１個の第１のデータ列「５」を並び替え、ステップＳ１０３のソート処理によりｎ＝１個の第２のデータ列「１」を並び替え、ステップＳ１０４のブロック交換マージにより「５」と「１」とを交換し、さらにステップＳ１０５のソート処理により第２のデータ列「５」を並び替えた後の状態を示している。なお、ｎ＝１なので、実際にはステップＳ１０２，Ｓ１０３，Ｓ１０５のソート処理は行われない。
【００４７】
ｎ＝１個の第１のデータ列とｎ＝１個の第２のデータ列について未処理のデータ列がなくなると、ステップＳ１００の処理によりｎを分割するが、ｎが１より小さくなるので（ステップＳ１０１において判定ＹＥＳ）、ステップＳ１０７のｒｅｔｕｒｎで次の処理、すなわちｎ＝２の処理が行われる。
【００４８】
図１０（Ｄ）は図１０（Ｃ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝２個の第１のデータ列「３８」を並び替え、ステップＳ１０３のソート処理によりｎ＝２個の第２のデータ列「１５」を並び替え、ステップＳ１０４のブロック交換マージによりｎ＝２個の第１のデータ列「３８」のｍ＝１番目のデータ「３」とｎ＝２個の第２のデータ列「１５」の１番目のデータ「１」とを比較し、「３８」と「１５」とを交換した後の状態を示している。
【００４９】
図１０（Ｅ）は図１０（Ｄ）の並びのデータにおいて、ステップＳ１０５のブロック交換マージにより、ｎ＝２個の第１のデータ列「１５」のｍ＝２番目のデータ「５」とｎ＝２個の第２のデータ列「３８」の１番目のデータ「３」とを比較し、「５」と「３」とを交換した後の状態を示している。
【００５０】
図１０（Ｆ）は図１０（Ｅ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝１個の第１のデータ列「５」とｎ＝１個の第２のデータ列「８」とを比較した後の状態を示している。ここでは、「８」の方が大きいので、「５」と「８」の交換は行われないことは言うまでもない。
【００５１】
図１０（Ｇ）は図１０（Ｆ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝１個の第１のデータ列「７」を並び替え、ステップＳ１０３のソート処理によりｎ＝１個の第２のデータ列「４」を並び替え、ステップＳ１０４のブロック交換マージにより「７」と「４」とを交換し、さらにステップＳ１０５のソート処理により第２のデータ列「７」を並び替えた後の状態を示している。なお、ｎ＝１なので、実際にはステップＳ１０２，Ｓ１０３，Ｓ１０５のソート処理は行われない。
【００５２】
図１０（Ｈ）は図１０（Ｇ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝１個の第１のデータ列「６」を並び替え、ステップＳ１０３のソート処理によりｎ＝１個の第２のデータ列「２」を並び替え、ステップＳ１０４のブロック交換マージにより「６」と「２」とを交換し、さらにステップＳ１０５のソート処理により第２のデータ列「６」を並び替えた後の状態を示している。なお、ｎ＝１なので、実際にはステップＳ１０２，Ｓ１０３，Ｓ１０５のソート処理は行われない。
【００５３】
ｎ＝１個の第１のデータ列とｎ＝１個の第２のデータ列について未処理のデータ列がなくなると、ステップＳ１００の処理によりｎを分割するが、ｎが１より小さくなるので（ステップＳ１０１において判定ＹＥＳ）、ステップＳ１０７のｒｅｔｕｒｎで次の処理、すなわちｎ＝２の処理が行われる。
【００５４】
なお、図１０（Ａ）のデータに対するソート処理およびブロック交換マージと、図１０（Ｂ）のデータに対するソート処理およびブロック交換マージと、図１０（Ｆ）のデータに対するソート処理およびブロック交換マージと、図１０（Ｇ）のデータに対するソート処理およびブロック交換マージとを分けて記述しているが、図８のフローチャートでは、図１０（Ａ）、図１０（Ｂ）、図１０（Ｆ）、図１０（Ｇ）のデータに対する処理が順番に実行される。
【００５５】
次に、図１０（Ｉ）は図１０（Ｈ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝２個の第１のデータ列「４７」を並び替え、ステップＳ１０３のソート処理によりｎ＝２個の第２のデータ列「２６」を並び替え、ステップＳ１０４のブロック交換マージによりｎ＝２個の第１のデータ列「４７」のｍ＝１番目のデータ「４」とｎ＝２個の第２のデータ列「２６」の１番目のデータ「２」とを比較し、「４７」と「２６」とを交換した後の状態を示している。
【００５６】
図１０（Ｊ）は図１０（Ｉ）の並びのデータにおいて、ステップＳ１０５のブロック交換マージにより、ｎ＝２個の第１のデータ列「２６」のｍ＝２番目のデータ「６」とｎ＝２個の第２のデータ列「４７」の１番目のデータ「４」とを比較し、「６」と「４」を交換した後の状態を示している。
【００５７】
図１０（Ｋ）は図１０（Ｊ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝１個の第１のデータ列「６」とｎ＝１個の第２のデータ列「７」とを比較した後の状態を示している。ここでは、「７」の方が大きいので、「６」と「７」の交換は行われないことは言うまでもない。
【００５８】
ｎ＝１個の第１のデータ列とｎ＝１個の第２のデータ列について未処理のデータ列がなくなると、ステップＳ１００の処理によりｎを分割するが、ｎが１より小さくなるので（ステップＳ１０１において判定ＹＥＳ）、ステップＳ１０７のｒｅｔｕｒｎで次の処理、すなわちｎ＝４の処理が行われる。
【００５９】
なお、図１０（Ｃ）のデータに対するソート処理およびブロック交換マージと、図１０（Ｄ）のデータに対するソート処理およびブロック交換マージと、図１０（Ｈ）のデータに対するソート処理およびブロック交換マージと、図１０（Ｉ）のデータに対するソート処理およびブロック交換マージとを分けて記述しているが、図８のフローチャートでは、図１０（Ｃ）、図１０（Ｄ）、図１０（Ｈ）、図１０（Ｉ）のデータに対する処理が順番に実行される。
【００６０】
次に、図１０（Ｌ）は図１０（Ｋ）の並びのデータにおいて、ステップＳ１０２のソート処理によりｎ＝４個の第１のデータ列「１３５８」を並び替え、ステップＳ１０３のソート処理によりｎ＝４個の第２のデータ列「２４６７」を並び替え、ステップＳ１０４のブロック交換マージにより、ｎ＝４個の第１のデータ列「１３５８」のｍ＝１番目のデータ「１」とｎ＝４個の第２のデータ列「２４６７」の１番目のデータ「２」とを比較した後の状態を示している。ここでは、「２」の方が大きいので、「１３５８」と「２４６７」の交換は行われないことは言うまでもない。
【００６１】
図１０（Ｍ）は図１０（Ｌ）の並びのデータにおいて、ステップＳ１０４のブロック交換マージにより、ｎ＝４個の第１のデータ列「１３５８」のｍ＝２番目のデータ「３」とｎ＝４個の第２のデータ列「２４６７」の１番目のデータ「２」とを比較し、「３５８」と「２４６」とを交換した後の状態を示している。
【００６２】
図１０（Ｎ）は図１０（Ｍ）の並びのデータにおいて、ステップＳ１０４のブロック交換マージにより、ｎ＝４個の第１のデータ列「１２４６」のｍ＝３番目のデータ「４」とｎ＝４個の第２のデータ列「３５８７」の１番目のデータ「３」とを比較し、「４６」と「３５」とを交換した後の状態を示している。
【００６３】
図１１（Ａ）は図１０（Ｎ）の並びのデータにおいて、ステップＳ１０４のブロック交換マージにより、ｎ＝４個の第１のデータ列「１２３５」のｍ＝４番目のデータ「５」とｎ＝４個の第２のデータ列「４６８７」の１番目のデータ「４」とを比較し、「５」と「４」とを交換した後の状態を示している。
【００６４】
図１１（Ｂ）は図１１（Ａ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝１個の第１のデータ列「５」とｎ＝１個の第２のデータ列「６」とを比較した後の状態を示している。ここでは、「６」の方が大きいので、「５」と「６」の交換は行われないことは言うまでもない。
【００６５】
図１１（Ｃ）は図１１（Ｂ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝１個の第１のデータ列「８」とｎ＝１個の第２のデータ列「７」とを比較し、「８」と「７」とを交換した後の状態を示している。
【００６６】
図１１（Ｄ）は図１１（Ｃ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝２個の第１のデータ列「５６」のｍ＝１番目のデータ「５」とｎ＝２個の第２のデータ列「７８」の１番目のデータ「７」とを比較した後の状態を示している。ここでは、「７」の方が大きいので、「５６」と「７８」の交換は行われないことは言うまでもない。
【００６７】
図１１（Ｅ）は図１１（Ｄ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝２個の第１のデータ列「５６」のｍ＝２番目のデータ「６」とｎ＝２個の第２のデータ列「７８」の１番目のデータ「７」とを比較した後の状態を示している。ここでは、「７」の方が大きいので、「６」と「７」の交換は行われないことは言うまでもない。
【００６８】
図１１（Ｆ）は図１１（Ｅ）の並びのデータにおいて、ステップＳ１０５のソート処理により、ｎ＝１個の第１のデータ列「７」とｎ＝１個の第２のデータ列「８」とを比較した後の状態を示している。ここでは、「８」の方が大きいので、「７」と「８」の交換は行われないことは言うまでもない。以上で、ソートが終了する。この例では、データの比較が１９回、データの交換が１２回でソートが終了した。
【００６９】
なお、ステップＳ１０２，Ｓ１０３，Ｓ１０５の各処理では、図８に示した関数を呼び出し、データの並び替えを再帰的にツリー構造で行う。例えばＮ＝４データが対象であれば、まずｎ＝１個について図８の処理を行い（例えば図１１（Ａ）、図１１（Ｂ）のデータに対する処理）、次にｎ＝２個について図８の処理を行い（例えば図１１（Ｃ）、図１１（Ｄ）のデータに対する処理）を行い、ｎ＝Ｎ／２＝２まで終えた時点で、さらに第２のデータ列について図８の処理を行う（例えば図１１（Ｅ）のデータに対する処理）。
【００７０】
本実施の形態のデータソート方法の処理をＣ言語で記述したプログラムを図１２に示す。また、従来のマージソート方法の処理をＣ言語で記述したプログラムを図１３に示す。また、本実施の形態のデータソート方法と従来の総当たり方式におけるデータの比較回数を表１に示す。
【００７１】
【表１】
2016091488.tif 000003
【００７２】
本実施の形態では、データの比較回数はデータの並びに依存せず、データ数Ｎが同じであれば、データの比較回数は一定である。本実施の形態は従来のマージソートの改良であり、ワークメモリを確保することなくデータの格納された領域内でデータ交換を繰り返すことで並び替え済みの２つの要素をマージする処理を実現した。本実施の形態のデータソート方法は、図１２に示すようにプログラムで記述すると、非常に単純なアルゴリズムになるので、プログラムサイズを小さくすることができる。
【００７３】
以上のように、本実施の形態では、処理時間が高速かつ一定で、プログラムサイズが小さく、ワークメモリを使用せず、少ないメモリ使用量で実行可能なデータソート方法を実現することができる。本実施の形態のデータソート方法は、データの比較回数が一定であり、処理時間が一定のため、リアルタイムで動くシステムに実装することができる。また、本実施の形態のデータソート方法は、ワークメモリを必要としないため、組み込み機器などメモリ使用量に制約のあるシステムに実装することができる。
【００７４】
なお、本実施の形態では、データを昇順に並び替える例で説明しているが、データを降順に並び替えることもできる。データを降順に並び替える場合には、第１のデータ列と第２のデータ列を降順に並び替えるソートを行い、ブロック交換マージについては、２つの並び終えたｎ個（ｎ＝１，２，４，８，・・・，Ｎ／２）の第１のデータ列とこの第１のデータ列に隣接するｎ個の第２のデータ列とについて、第１のデータ列のｍ番目（ｍは１以上ｎ以下の整数）のデータと第２のデータ列の１番目のデータとを大小比較し、第２のデータ列の１番目のデータの方が大きいときに、第１のデータ列のｍ番目以降の｛ｎ−（ｍ−１）｝個のデータと第２のデータ列の１番目以降の｛ｎ−（ｍ−１）｝個のデータとをブロック交換する処理を、ｍ＝１からｍ＝ｎまで順次行う処理とすればよい。
【産業上の利用可能性】
【００７５】
本発明は、データを昇順または降順に並び替える技術に適用することができる。
【符号の説明】
【００７６】
１…データソート装置、１−１…ＣＰＵ、１−２…ＲＡＭ、１−３…ＲＯＭ、１−４…ハードディスク装置、１−５，１−６…インターフェイス。
【図１】
2016091488.tif 000004
【図２】
2016091488.tif 000005
【図３】
2016091488.tif 000006
【図４】
2016091488.tif 000007
【図５】
2016091488.tif 000008
【図６】
2016091488.tif 000009
【図７】
2016091488.tif 000010
【図８】
2016091488.tif 000011
【図９】
2016091488.tif 000012
【図１０】
2016091488.tif 000013
【図１１】
2016091488.tif 000014
【図１２】
2016091488.tif 000015
【図１３】
2016091488.tif 000016
【図１４】
2016091488.tif 000017