マージ
日本語 | 併合、合併、融合 |
英語 | merge |
ふりがな | まーじ |
フリガナ | マージ |
アルゴリズムの一種。
ソートされた配列2つを1つにまとめること。
その際、マージ後の配列もソートされた状態になるようにする。つまり、「ただ単にある配列の後ろに配列をくっつける」わけではなく、並び順がソートされた状態になるようお互いの配列の要素を挟み込んでいく。
「マージソート」の「マージ」はこれに当たる。
Javaにはマージを行うためのメソッドは存在しない。
専用のアルゴリズムを作成するか、処理時間を気にしないのであればArrayListクラスに2つの配列を足し、ソートし直すのがいいだろう。
ソートされた配列2つを1つにまとめること。
その際、マージ後の配列もソートされた状態になるようにする。つまり、「ただ単にある配列の後ろに配列をくっつける」わけではなく、並び順がソートされた状態になるようお互いの配列の要素を挟み込んでいく。
「マージソート」の「マージ」はこれに当たる。
Javaにはマージを行うためのメソッドは存在しない。
専用のアルゴリズムを作成するか、処理時間を気にしないのであればArrayListクラスに2つの配列を足し、ソートし直すのがいいだろう。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// ソート済みの配列2つを用意します。
int[] intsL = new int[] { 100, 400, 500 };
int[] intsR = new int[] { 100, 200, 300, 600 };
// マージします。
int[] intsResult = merge( intsL, intsR );
// 出力します。
for( int iF1 = 0; iF1 < intsResult.length; ++iF1 )
{
System.out.println( intsResult[iF1] );
}
// 100
// 100
// 200
// 300
// 400
// 500
// 600
}
/**
* マージします。
*/
public static int[] merge( int[] intsL, int[] intsR )
{
// 出力用の配列を用意します。
int[] intsResult = new int[intsL.length + intsR.length];
int intsLPos = 0;
int intsRPos = 0;
// それぞれの要素を比較して、小さい方を先にセットします。
while( intsLPos < intsL.length && intsRPos < intsR.length )
{
if( intsR[intsRPos] < intsL[intsLPos] )
{
intsResult[intsLPos + intsRPos] = intsR[intsRPos];
++intsRPos;
}
else
{
intsResult[intsLPos + intsRPos] = intsL[intsLPos];
++intsLPos;
}
}
// 残りをコピー。
if( intsLPos >= intsL.length )
{
for( ; intsRPos < intsR.length; ++intsRPos )
{
intsResult[intsLPos + intsRPos] = intsR[intsRPos];
}
}
else
{
for( ; intsLPos < intsL.length; ++intsLPos )
{
intsResult[intsLPos + intsRPos] = intsL[intsLPos];
}
}
// 配列を返します。
return intsResult;
}
}
public class Sample
{
public static void main( String[] args )
{
// ソート済みの配列2つを用意します。
int[] intsL = new int[] { 100, 400, 500 };
int[] intsR = new int[] { 100, 200, 300, 600 };
// マージします。
int[] intsResult = merge( intsL, intsR );
// 出力します。
for( int iF1 = 0; iF1 < intsResult.length; ++iF1 )
{
System.out.println( intsResult[iF1] );
}
// 100
// 100
// 200
// 300
// 400
// 500
// 600
}
/**
* マージします。
*/
public static int[] merge( int[] intsL, int[] intsR )
{
// 出力用の配列を用意します。
int[] intsResult = new int[intsL.length + intsR.length];
int intsLPos = 0;
int intsRPos = 0;
// それぞれの要素を比較して、小さい方を先にセットします。
while( intsLPos < intsL.length && intsRPos < intsR.length )
{
if( intsR[intsRPos] < intsL[intsLPos] )
{
intsResult[intsLPos + intsRPos] = intsR[intsRPos];
++intsRPos;
}
else
{
intsResult[intsLPos + intsRPos] = intsL[intsLPos];
++intsLPos;
}
}
// 残りをコピー。
if( intsLPos >= intsL.length )
{
for( ; intsRPos < intsR.length; ++intsRPos )
{
intsResult[intsLPos + intsRPos] = intsR[intsRPos];
}
}
else
{
for( ; intsLPos < intsL.length; ++intsLPos )
{
intsResult[intsLPos + intsRPos] = intsL[intsLPos];
}
}
// 配列を返します。
return intsResult;
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // ソート済みの配列2つを用意します。 int[] intsL = new int[] { 100, 400, 500 }; int[] intsR = new int[] { 100, 200, 300, 600 }; // マージします。 int[] intsResult = merge( intsL, intsR ); // 出力します。 for( int iF1 = 0; iF1 < intsResult.length; ++iF1 ) { System.out.println( intsResult[iF1] ); } // 100 // 100 // 200 // 300 // 400 // 500 // 600 } /** * マージします。 */ public static int[] merge( int[] intsL, int[] intsR ) { // 出力用の配列を用意します。 int[] intsResult = new int[intsL.length + intsR.length]; int intsLPos = 0; int intsRPos = 0; // それぞれの要素を比較して、小さい方を先にセットします。 while( intsLPos < intsL.length && intsRPos < intsR.length ) { if( intsR[intsRPos] < intsL[intsLPos] ) { intsResult[intsLPos + intsRPos] = intsR[intsRPos]; ++intsRPos; } else { intsResult[intsLPos + intsRPos] = intsL[intsLPos]; ++intsLPos; } } // 残りをコピー。 if( intsLPos >= intsL.length ) { for( ; intsRPos < intsR.length; ++intsRPos ) { intsResult[intsLPos + intsRPos] = intsR[intsRPos]; } } else { for( ; intsLPos < intsL.length; ++intsLPos ) { intsResult[intsLPos + intsRPos] = intsL[intsLPos]; } } // 配列を返します。 return intsResult; } }