コードのトピックでは、2 つのシリーズをマージして並べ替える必要がある状況に時々遭遇するため、今日はブロガーがそのような並べ替えを実行する方法を学習します。
1. 原題:
2 つのシーケンスを昇順に入力し、2 つのシーケンスを結合して順序付けされたシーケンスとして出力します。
説明を入力してください:
入力には 3 行が含まれており、最初の行にはスペースで区切られた 2 つの正の整数 n、m が含まれています。n は 2 行目の最初の昇順の数字の数を表し、m は 3 行目の 2 番目の昇順の数字の数を表します。
2 行目には、スペースで区切られた n 個の整数が含まれています。
3 行目には、スペースで区切られた m 個の整数が含まれています。
出力の説明:
出力は 1 行で、長さ n+m の昇順シーケンスです。つまり、長さ n の昇順シーケンスと長さ m の昇順シーケンスの要素が昇順に並べ替えられ、マージされます。
例
入力:
5 6
1 3 7 9 22
2 8 10 17 33 44
出力:
1 2 3 7 8 9 10 17 22 33 44
2. アイデア:
2 つの配列はすでに順序付けされているため、2 つの配列の最小値を順番に比較し、それを新しい空の配列に入れ、最後に新しい配列を順番に出力できます。
3. コードの実装
3.1 2 つの配列の重複部分の比較
int i = 0;
int j = 0;
int k = 0;
int n = 0;
int m = 0;
int r = 0;
scanf("%d %d",&n,&m);
int arrn[n];//第一个数组
int arrm[m];//第二个数组
int arr[n+m];//新数组
for(i=0;i<n;i++)//输入第一个数组数值
{
scanf("%d",&j);
arrn[i] = j ;
}
for(i=0;i<m;i++)//输入第二个数组数值
{
scanf("%d",&j);
arrm[i] = j ;
}
j=0;
i=0;
while(k<m&&j<n)
{
if(arrn[j]<arrm[k])
{
arr[i++]=arrn[j++];//在将最小值赋到新数组后,两个数组下标同时+1,重新判断n数组和m数组哪个最小值更小
}
else
{
arr[i++]=arrm[k++];//同理
}
}
3.2 配列の残りの要素の比較と出力
ただし、配列の 1 つが並べ替えられた場合、もう 1 つの配列には新しい配列に割り当てられていない要素がまだ含まれている可能性があるため、この時点で残りの要素を割り当てる必要があります。
if (k==m)//当k==m的时候,就是下标已经达到原来设计的数组大小,说明m的数组的元素已经全部被拿走了,所以此时需要将n数组中剩下的元素进行赋值
{
while(j<n)
{
arr[i++]=arrn[j++];
}
}
else
{
while(k<m)
{
arr[i++]=arrm[k++];
}
}
for(i=0;i<n+m;i++)
printf("%d ",arr[i]);
このようにして, すでにソートされた 2 つの配列をマージしてソートすることができます. 質問にそれらを新しい配列に入れるという明確な要件がない場合, 3 番目の新しい配列を作成せずに直接出力することもできます.詳細はこちらです。
最後に書きます
この記事が役に立ったら、小さな「いいね!」をお願いします❤~ あなたのサポートが私の最大のモチベーションです。
ブロガーは才能も知識も少ない初心者であるため、間違いがあることは避けられません。誰でも議論したり質問したりすることを歓迎します。ブロガーはできるだけ早く修正します。
ご視聴ありがとうございますふふ(๑•̀ㅂ•́)و✧~!