フリーランスプログラマーになるには 12プログラミングをしてみる - ソート
このノートはフリーランスプログラマーとはどういったものなのか、どうしたらなれるのか、またどのように生計をたてるのか等を、私の経験をもとに実情を解説するシリーズの一つです。
今回は並び替え処理をJavaScriptでプログラミングしながら解説します。
ATOMにprogram5.jsを作成し、コーディングすると楽だと思います。予約文字とかに色つきますし。ATOMでのファイル作成手順は上記の初回を参照してください。
!練習問題の前に!
初回の変数の項で数値と文字列を解説しました。そして、今までは1変数に対して1つの値のみ設定してきました。しかし、以下のように「配列」を使うと複数の値が設定できるのです。
let names = ['Nakata', 'Nakamura', 'Honda', 'Kagawa'];
console.log(names);
console.log(names.length); // 配列の長さが取得できます。
console.log(names[0]); // 配列の中身にはこのようにアクセスします。0から始まるのに注意してください。
console.log(names[1]);
console.log(names[2]);
console.log(names[3]);
for(let i = 0; i < names.length; i++){
console.log(names[i]);
}
// このような記述方法もあります。
for(let name of names){
console.log(name);
}
// もちろん数値も設定できます。
let nums = [5, 6, 1, 8, 7];
nums[0] = 3; // 中身の変更もこのように行なえます。
console.log(nums);
練習問題1
5 3 2 1 4の数字を以下のように小さい順に並び替えて表示してください。
let nums = [5, 3, 2, 1, 4];
// TODO : 並び替えを記述
console.log(nums);
ヒント
小さい値を見つけたときに単純に配列に設定してしまうと、それ以前の値が消えてしまいます。そうしないためにも一時的な変数を用意して値を退避して入れ替えてあげましょう。
答え
for(let i = 0; i < nums.length - 1; i++){
for(let d = i + 1; d < nums.length; d++){
if(nums[d] < nums[i]){
let temp = nums[i];
nums[i] = nums[d];
nums[d] = temp;
}
}
}
解説
今回の答えの形はバブルソートと言われ、もっとも単純な実装方法の並び替え方法になります。ポイントはネストしたfor文の始まりを
let d = i + 1;
とする部分と、現在値よりもより小さい値が見つかったときに
let temp = nums[i];
nums[i] = nums[d];
nums[d] = temp;
一時的な変数を使用して値の交換を行うところになります。
並び替え(ソーティング)のアルゴリズムは非常に奥の深いもので、今現在もより効率の良いものを求めて研究が進められています。有名所ですとクイックソート、ヒープソート、マージソートなどがあります。興味がありましたら是非調べてみてください。
最後に
今回でプログラミングの解説シリーズは終了です。プログラミングがなんとなくどういうものか分かっていただけたでしょうか?今まで学んだこと以外に、関数やクラスというプログラミングを語る上では非常に重要な要素がありますが、それらは本質的には人間がよりプログラミングをしやすくするための物であってコンピューターがプログラムを実行するのに必須のものではありません。
これ以降も色々と学んでいかれることと思いますが、初心者のころはクラスについて「オブジェクト指向は~」「多態性は~」などと色々言われてもピンと来ないと思われます。しかし、より大きなコードベースのプログラミングをし始めると、クラスや関数の便利さが身にしみて分かるようになりますので、なぜそれらが必要とされるのか、どういう考えのもとに考案されたかなどが自然と理解できるようになります。プログラミングに関連する概念や考え方は最初はピンと来ないものが多々ありますが、使ってみたり、経験していくとストンと腑に落ちるタイミングがありますので、新しいものを学ぶ際は気楽に取り組むようにされると良いと思います。