dポイントプレゼントキャンペーン実施中!

はじめまして。このjavascriptのプログラムの意味を教えていただきたいです。
プログラミング初心者なので分かりやすく詳細に教えていただけると助かります。


public static void merge(int a[],int b[],int c[]){
int i = 0, j = 0, k = 0;
while(i < a.length && j < b.length)
if(a[i] <= b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
while(i < a.length) c[k++] = a[i++];
while(j < b.length) c[k++] = b[j++];
}
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
final int NA = 10;
final int NB = 20;
int a[] = new int[NA];
int b[] = new int[NB];
int c[] = new int[NA + NB];
a[0] = (int)(Math.random() * 10);
for(int i = 1;i < NA;i++)
a[i] = a[i - 1] + (int)(Math.random() * 10);
b[0] = (int)(Math.random() * 10);
for(int i = 1;i < NB;i++)
b[i] = b[i - 1] + (int)(Math.random() * 10);
System.out.print("a:");
for(int i = 0;i < NA;i++)System.out.print(""+a[i]);
System.out.println();
System.out.print("b:");
for(int i = 0;i < NB;i++)System.out.print(""+b[i]);
System.out.println();
merge(a,b,c);
System.out.print("c:");
for(int i = 0;i < NA;i++)System.out.print(""+c[i]);
System.out.println();


}

}

質問者からの補足コメント

  • 最後から2つ前の文ですが、for(int i=0;i<NA+NB;i++)でした。

      補足日時:2019/07/05 11:54

A 回答 (2件)

このレベルであれば、まずは初学者向けの学習をすることを強くお勧めします。



以下の学習サイトを推薦しておきます。
無料プランで、十分にこのコードが理解できる域に達します。
理解が早ければ1日もかからず習得できると思います。
https://prog-8.com/
https://codeprep.jp/
    • good
    • 1

これはJavaであって、JavaScriptではありませんけどね。



a
10個の乱数を抽出して格納。
N個目は、N-1個目に抽出した値を加算する。

b
20個の乱数を抽出して格納。
N個目は、N-1個目に抽出した値を加算する。

c
a、bで求めた値を比較し、小さい値から順に格納。

a、b、cの値を出力。

試したところ、例えば以下の結果が出力されました。
a:291617182632343948
b:3591019253034414849505766717478808693
c:2359910161718192526303234343941484849505766717478808693

これはそれぞれ、カンマで区切ると以下のようになります。
a:2,9,16,17,18,26,32,34,39,48
b:3,5,9,10,19,25,30,34,41,48,49,50,57,66,71,74,78,80,86,93
c:2,3,5,9,9,10,16,17,18,19,25,26,30,32,34,34,39,41,48,48,49,50,57,66,71,74,78,80,86,93

aは10個、bは20個抽出しており、N個目はN-1個目の値を加算した値になります。
例えばa:2,9,16,17は、抽出された値は以下ということになります。
1個目 抽出値:2 結果:2
2個目 抽出値:7 結果:9
3個目 抽出値:7 結果:16
4個目 抽出値:1 結果:17

同じようにbも20個の値を生成しています。

cは先に示したカンマ区切りの値の通り、a、bの値を1つずつ比較していき、小さい値順にソートされています。

merge()は下記の通りとなります。
public static void merge(int a[],int b[],int c[]){
int i = 0, j = 0, k = 0;
while(i < a.length && j < b.length)
if(a[i] <= b[j]) c[k++] = a[i++]; // a≦b の場合はaの値を優先する
else c[k++] = b[j++]; // a>b の場合はbの値を優先する
while(i < a.length) c[k++] = a[i++]; // (1)aの値が余ってる時は残りは全部aの値
while(j < b.length) c[k++] = b[j++]; // bの値が余ってる時は残りは全部bの値
}

(1)は、極端な例では、a:9, 18, 27, 36, 45 ・・・ と、すべて乱数が9だった時に、
b:1, 2, 3, 4, 5 ・・・ と、すべて乱数が1だった時には有り得る処理です。
値の個数が、aが10個、bが20個だから(1)はありえないよ、ということにはなりません。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!