例題として、配列内の最大値を取得するプログラムについて考えてみましょう。
getArrayMax関数を作成し、配列から最大値を取得させてみましょう。
動かしてみよう
サンプルコードを動かしてみましょう。
実行ボタンを押してみてください。
また int input[] の { } 内を色々と変えての実行もしてみてください。
input配列内の最大値が取得できたことが出力結果から確認できたと思います。
では、解説に進みましょう。
解説
今回の解説ですが、【例題】配列内の最小値を取得しようとほぼ同じですので、そちらを参照ください。
getArrayMin関数とgetArrayMax関数の差は下記だけです。
/* getArrayMin関数 */
if( min > array[i])
{
min = array[i];
}
/* getArrayMax関数 */
if( max < array[i])
{
max = array[i];
}
getArrayMin関数では現在の最小値minよりも array[i] が小さい場合に、array[i] によってminを上書きすることで最小値を求めていました。
getArrayMax関数では逆に、現在の最大値maxよりも array[i] が大きい場合に、array[i] によってmaxを上書きすることで最大値を求めています。
別のアルゴリズムを考えてみよう
せっかくなので違う方針でも最大値取得をしてみましょう。
関数から配列の最大値の位置を貰ってみよう
最初のサンプルコードでは、getArrayMax関数によって配列内の最大値を貰い、それをmain関数で表示させていましたが、最大値そのものではなく、最大値が配列のどこにあるか、という情報でもmain関数で最大値表示させることができそうですね。
その方針で実装してみましょう。
上記では、getArrayMax関数に代わり、getIndexArrayMax関数を新規作成しています。
getArrayMax関数が配列内の最大値を返していたのに対し、getIndexArrayMax関数は配列の最大値が格納されている位置を返しています。
主な実装箇所の差異は下記です。
if( array[indexMax] < array[i] )
{
indexMax = i;
}
array[indexMax] と array[i] の値を比較し、array[i]の方が大きいようであれば、indexMaxを更新させています。
これにより最大値が格納されている配列の位置を記憶させ、return文でmain関数に返しています。
main関数では貰った配列最大値の格納位置を利用し、printf出力によって配列のどこに最大値が入っていたのかを表示させています。
最初のサンプルコードではどこに入っていたかまでは分からなかったので、こちらの方が機能としてはリッチといえますね。
先にソートしてから最大値を調べてみよう
先の2つのサンプルではgetArrayMax関数やgetIndexArrayMax関数の新規作成をおこないましたが、もしすでに 【例題】配列の要素を大きい順(降順)に並べ替えよう のようなソート処理が実装されていた場合、最大値を取得するためにそちらを利用することも考えられます。
ソート後の配列では input[0] に最大値が格納されますので、そのことを利用して最大値を表示させています。
先の2つのサンプルと異なり、input配列そのものを並び替えてしまうので、もしinput配列をイジってはいけないような制約がある場合には適さない実装となってしまいますが、方法論の一つとしてはおさえておいてもいいのかなと思います。
同じ「配列の最大値を取得する」という目的でも、状況に応じて色々な手段がとれるのがプログラミングの面白いところですね。
以上です。
ではまた。